raise UnknownTimeZoneError(zone)
pytz.exceptions.UnknownTimeZoneError: 'Asia/Beijing'
源码中是这样的:
def _tz_from_env(tzenv):
if tzenv[0] == ':':
tzenv = tzenv[1:]
# TZ specifies a file
if os.path.isabs(tzenv) and os.path.exists(tzenv):
with open(tzenv, 'rb') as tzfile:
return pytz.tzfile.build_tzinfo('local', tzfile)
# TZ specifies a zoneinfo zone.
try:
tz = pytz.timezone(tzenv)
# That worked, so we return this:
return tz
except pytz.UnknownTimeZoneError:
raise pytz.UnknownTimeZoneError(
"tzlocal() does not support non-zoneinfo timezones like %s. \n"
"Please use a timezone in the form of Continent/City")
报错原因:服务器的时区,在pytz的时区目录中找不到。当时在服务器上信息为"Asia/Beijing"
解决步骤:
from tzlocal import get_localzone
local_tz = get_localzone()
print(local_tz)
# <class 'pytz.tzfile.Asia/Beijing'>
“ pytz”模块用于指定获取当前日期和时间的时区。
import pytz
print(len(pytz.all_timezones))
for timezone in pytz.all_timezones:
print(timezone)
# 592
# Africa/Abidjan
# Africa/Accra
# Africa/Addis_Ababa
# Africa/Algiers
# Africa/Asmara
# Africa/Asmera
# Africa/Bamako
# Africa/Bangui
# Africa/Banjul
# ...
我们发现,在pytz中,并没有发现Asia/Beijing的时区。中国的时区有:
import pytz
print(pytz.country_timezones('cn'))
# ['Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing', 'Asia/Urumqi', 'Asia/Kashgar']
可以看到,中国的时区可能有:'Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing',最后两个不知道是什么。我们可能使用的'Asia/Shanghai'比较多。
但是有些时间转换的工具却有,如postgres支持set timezone的命令,这是在django中看到的。按理说pytz使用的是标准的时区数据库,我特意下载了查看,的确是没有。
import pytz
def get_correct_localzone():
try:
return get_localzone()
except pytz.UnknownTimeZoneError:
return pytz.timezone("Asia/Shanghai")
使用时:
local_tz = get_correct_localzone()
print(datetime.datetime.fromtimestamp(cur_time, tz=local_tz))
# 2020-11-29 01:47:55+08:00
时区是否相等的判断:
from pytz import timezone
print(timezone('Asia/Shanghai').zone) # Asia/Shanghai
a = timezone('Asia/Shanghai')
b = timezone('Asia/Shanghai')
c = timezone('US/Mountain')
print(a == b) # True
print(a.zone == b.zone) # True
print(a.zone == "Asia/Shanghai") # True
print(a == c) # False
print('Asia/Shanghai' in pytz.all_timezones) # True
print(a in pytz.all_timezones) # False
print(a.zone in pytz.all_timezones) # True
关于时区使用的几点想法:
1. 如果你的网站可能有来自其它时区的,可能你要考虑这个问题。都是一个地区的话,还要看服务器是否与用户在一个地区,如果不在,也要考虑。
2. 因此,基本上要考虑服务器时区与用户时区。服务器时区可以配置在系统中,全局生效。而用户时区则与用户相关,可以由用户自已进行设置。
3. 在生成相关时间对象时要加入时区的信息,并在输出时进行合适的转换。
参考: