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

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

问题描述

如何获得奥尔森时区名称(例如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/altzonetime.tzname 获得,我认为这足以正确匹配 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/Belize', 'America/Cambridge_Bay',美国/坎昆"、美国/芝加哥"、美国/奇瓦瓦"、'America/Coral_Harbour'、'America/Costa_Rica'、'America/El_Salvador'、'美国/韦恩堡','美国/危地马拉','美国/印第安纳/印第安纳波利斯','美国/印第安纳/诺克斯','美国/印第安纳州/马伦戈','美国/印第安纳州/马伦戈','美国/印第安纳州/彼得堡','美国/印第安纳州/Tell_City','美国/印第安纳州/Vevay','美国/印第安纳州/文森斯',美国/印第安纳/威纳马克"、美国/印第安纳波利斯"、美国/伊魁特"、'美国/肯塔基/路易斯维尔','美国/肯塔基/路易斯维尔','美国/肯塔基/蒙蒂塞洛','美国/诺克斯_IN',美国/路易斯维尔"、美国/路易斯维尔"、美国/马那瓜"、美国/马塔莫罗斯"、美国/梅诺米尼"、美国/梅里达"、'美国/墨西哥城','美国/蒙特雷','America/North_Dakota/Beulah', 'America/North_Dakota/Center','America/North_Dakota/New_Salem', 'America/Ojinaga','America/Pangnirtung'、'America/Rainy_River'、'America/Rankin_Inlet'、美国/坚决"、美国/坚决"、美国/特古西加尔巴"、美国/温尼伯"、CST6CDT"、加拿大/中部"、墨西哥/一般"、'US/Central'、'US/East-Indiana'、'US/Indiana-Starke']

['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.

更改时区后的测试脚本:

Testing script after changing timezone:

$ 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天全站免登陆