获取当地时区的Olson TZ名称? [英] Get the Olson TZ name for the local timezone?

查看:274
本文介绍了获取当地时区的Olson TZ名称?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何获取 Olson时区名称(例如 Australia / Sydney )对应于C的 localtime 通话?

How do I get the Olson timezone name (such as Australia/Sydney) corresponding to the value given by C's localtime call?

这是通过 TZ 重写的值,通过符号链接或者在时间相关的系统配置文件中设置 / etc / localtime 或设置 TIMEZONE 变量。

This is the value overridden via TZ, by symlinking /etc/localtime, or setting a TIMEZONE variable in time-related system configuration files.

推荐答案

我认为最好的选择是通过所有的pytz时区,并检查哪个匹配当地时区,每个pytz时区对象包含有关utcoffset和tzname的信息,如CDT ,EST,可以从 time.timezone / altzone time.tzname 获得有关本地时间的相关信息,而I认为这足以正确匹配pytz数据库中的本地时区,例如

I think best bet is to go thru all pytz timezones and check which one matches local timezone, each pytz timezone object contains info about utcoffset and tzname like CDT, EST, same info about local time can be obtained from time.timezone/altzone and time.tzname, and I think that is enough to correctly match local timezone in pytz database e.g.

import time
import pytz
import datetime

local_names = []
if time.daylight:
    local_offset = time.altzone
    localtz = time.tzname[1]
else:
    local_offset = time.timezone
    localtz = time.tzname[0]

local_offset = datetime.timedelta(seconds=-local_offset)

for name in pytz.all_timezones:
    timezone = pytz.timezone(name)
    if not hasattr(timezone, '_tzinfos'):
        continue#skip, if some timezone doesn't have info
    # go thru tzinfo and see if short name like EDT and offset matches
    for (utcoffset, daylight, tzname), _ in timezone._tzinfos.iteritems():
        if utcoffset == local_offset and tzname == localtz:
            local_names.append(name)

print local_names

输出:


['America / Atikokan','America / Bahia_Banderas',
'America / Bahia_Banderas','America /伯利兹,美国/剑桥,
'Am埃里卡/坎昆,美洲/芝加哥,美洲/奇瓦瓦,
'America / Coral_Harbour','America / Costa_Rica','America / El_Salvador',
'America / Fort_Wayne'美洲/危地马拉,
'美洲/印第安纳州/印第安纳波利斯','美洲/印第安纳州/诺克斯',
'美洲/印第安纳州/马伦戈','美洲/印第安纳州/马伦戈',
'美洲/印第安纳州/彼得堡,美洲/印第安纳州/ Tell_City,
美洲/印第安纳州/维埃,美洲/印第安纳州/文森,
'美洲/印第安纳州/美洲/肯塔基州/路易斯维尔州,美国/肯塔基州/路易斯维尔州,
'America /肯塔基州/ Monticello','America / Knox_IN',$ b $ 美国/路易斯维尔,美国/路易斯维尔,美国/马那瓜,
'美国/马塔莫罗斯','美洲/梅诺米内','美洲/梅里达',
'美国/墨西哥 - ,美洲/蒙特雷,
'美洲/北达科他州/北岛,'美洲/ N orth_Dakota / Center',
'America / North_Dakota / New_Salem','America / Ojinaga',
'America / Pangnirtung','America / Rainy_River','America / Rankin_Inlet',
'美国/ Resolute','美国/特古西加尔巴',
'美洲/温尼伯','CST6CDT','加拿大/中央','墨西哥/将军',
'中央,美国/印第安纳州,美国/印第安纳州 - 斯塔克]

['America/Atikokan', 'America/Bahia_Banderas', 'America/Bahia_Banderas', 'America/Belize', 'America/Cambridge_Bay', 'America/Cancun', 'America/Chicago', 'America/Chihuahua', 'America/Coral_Harbour', 'America/Costa_Rica', 'America/El_Salvador', 'America/Fort_Wayne', 'America/Guatemala', 'America/Indiana/Indianapolis', 'America/Indiana/Knox', 'America/Indiana/Marengo', 'America/Indiana/Marengo', 'America/Indiana/Petersburg', 'America/Indiana/Tell_City', 'America/Indiana/Vevay', 'America/Indiana/Vincennes', 'America/Indiana/Winamac', 'America/Indianapolis', 'America/Iqaluit', 'America/Kentucky/Louisville', 'America/Kentucky/Louisville', 'America/Kentucky/Monticello', 'America/Knox_IN', 'America/Louisville', 'America/Louisville', 'America/Managua', 'America/Matamoros', 'America/Menominee', 'America/Merida', 'America/Mexico_City', 'America/Monterrey', 'America/North_Dakota/Beulah', 'America/North_Dakota/Center', 'America/North_Dakota/New_Salem', 'America/Ojinaga', 'America/Pangnirtung', 'America/Rainy_River', 'America/Rankin_Inlet', 'America/Resolute', 'America/Resolute', 'America/Tegucigalpa', 'America/Winnipeg', 'CST6CDT', 'Canada/Central', 'Mexico/General', 'US/Central', 'US/East-Indiana', 'US/Indiana-Starke']

在生产中,您可以创建这样的映射事先保存它,而不是总是迭代。

In production you can create such a mapping beforehand and save it instead of iterating always.

更改时区后测试脚本:


$ export TZ ='澳大利亚/悉尼'

$ python get_tz_names.py

['南极洲/麦考瑞','澳大利亚/ ACT','澳大利亚/布里斯班',$澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/澳大利亚/皇后区土地,澳大利亚/悉尼,澳大利亚/塔斯马尼亚,
澳大利亚/维多利亚州]

$ export TZ='Australia/Sydney'
$ python get_tz_names.py
['Antarctica/Macquarie', 'Australia/ACT', 'Australia/Brisbane', 'Australia/Canberra', 'Australia/Currie', 'Australia/Hobart', 'Australia/Lindeman', 'Australia/Melbourne', 'Australia/NSW', 'Australia/Queensland', 'Australia/Sydney', 'Australia/Tasmania', 'Australia/Victoria']

这篇关于获取当地时区的Olson TZ名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆