pytz.exceptions.UnknownTimeZoneError解决办法

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"

解决步骤:

1. tzlocal.get_localzone查看时区,时区显示为北京

from tzlocal import get_localzone
 
local_tz = get_localzone()
print(local_tz)
# <class 'pytz.tzfile.Asia/Beijing'>

 

2.pytz.all_timezones,查看pytz支持的时区

“ 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使用的是标准的时区数据库,我特意下载了查看,的确是没有。

3.捕获异常,返回默认时区

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. 在生成相关时间对象时要加入时区的信息,并在输出时进行合适的转换。


参考:

  1. https://blog.csdn.net/shanliangliuxing/article/details/8557865
  2. https://blog.csdn.net/cumubi7453/article/details/107800728
  3. https://blog.csdn.net/u010213931/article/details/79192595

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值