我使用以下代码将UTC时间转换为本地时间转换:
def UTC_to_local(timezone_str, datetime_UTC):
"""
convert UTC datetime to local datetime. Input datetime is naive
"""
try:
from_zone = dateutil.tz.gettz('UTC')
to_zone = dateutil.tz.gettz(timezone_str)
datetime_UTC = datetime_UTC.replace(tzinfo=from_zone)
# Convert time zone
datetime_local = datetime_UTC.astimezone(to_zone)
except Exception as e:
raise
return datetime_local
如果我给出了正确的timezone_str(例如,'America / Chicago'),它会按预期工作。 但即使我给出意想不到的timezone_str(例如'America / Chicago1'或'Americaerror / Chicago'),仍然没有例外,它只返回不同的数字!我认为获得意外时区字符串的异常比“做出最佳猜测”更合理。
此外,我发现(使用IPYTHON):
In [171]: tz.gettz("America/Chicago")
Out[171]: tzfile('/usr/share/zoneinfo/America/Chicago')
In [172]: tz.gettz("America/Chicago1")
Out[172]: tzstr('America/Chicago1')
In [173]: tz.gettz("Americaerror/Chicago")
(None)
答案 0 :(得分:3)
解决方案#1:如果您可以使用MSDN article
import pytz
if timezone_str in pytz.all_timezones:
...
else:
raise ValueError('Invalid timezone string!')
解决方案#2:
import os
import tarfile
import dateutil.zoneinfo
zi_path = os.path.abspath(os.path.dirname(dateutil.zoneinfo.__file__))
zonesfile = tarfile.TarFile.open(os.path.join(zi_path, 'dateutil-zoneinfo.tar.gz'))
zonenames = zonesfile.getnames()
if timezone_str in zonenames:
...
else:
raise ValueError('Invalid timezone string!')
答案 1 :(得分:0)
Sergey 的回答很棒,但如果您选择解决方案 #1,那么最好使用 pytz.all_timezones_set
:
if location in pytz.all_timezones_set
...
这是两者之间的速度比较:
In [14]: %timeit "Asia/Omsk" in pytz.all_timezones
3.09 µs ± 7.66 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [15]: %timeit "Asia/Omsk" in pytz.all_timezones_set
96.5 ns ± 0.0991 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
注意:签入pytz.all_timezones
的速度取决于搜索的项目。我选择了列表中间的一项(Asia/Omsk
是 593 项中的第 296 项)。