我可以像这样创建一个特定于时区的datetime对象

import datetime
d = datetime.datetime.now().astimezone()


结果是

datetime.datetime(2018, 4, 2, 15, 12, 2, 807451, tzinfo=datetime.timezone(datetime.timedelta(0, 7200), 'CEST'))


看起来tzinfo由两个值/属性表示:一个时间增量和一个字符串。但是我该如何访问它们?
我想做这样的事情

d.tzinfo.delta
d.tzinfo.name


我需要这些信息,才能将日期时间与JSON进行反序列化。

我不想将第三方软件包用于此类解决方案。

最佳答案

在这种情况下,tzinfodatetime.timezone() class的实例:


  timezone类是tzinfo的子类,每个实例代表一个时区,该时区由与UTC的固定偏移量定义。


您可以使用tzinfo.utcoffset()tzinfo.utcname()方法来访问变化量和名称。对于timezone()实例,将忽略每个采用的参数,但是通常您将传入它们附加到的datetime实例:

d.tzinfo.utcoffset(d)
d.tzinfo.utcname(d)


您通常会在datetime.datetime实例上调用这些实例,该实例具有相同的方法(但不带任何参数),然后这些实例将处理将正确的参数传递给所包含的tzinfo属性上的方法。

演示:

>>> import datetime
>>> d = datetime.datetime.now().astimezone()
>>> d.utcoffset()
datetime.timedelta(seconds=7200)
>>> d.tzname()
'CEST'
>>> d.tzinfo.utcoffset(d)
datetime.timedelta(seconds=7200)
>>> d.tzinfo.utcoffset(d) is d.utcoffset()  # they are the same object
True


datetime.timezone()子类只是tzinfo时区的一种实现,诸如pytz之类的第三方库提供了它们自己的库,并且utcoffset()tzname()返回值对于带有历史信息的时区可能会有所不同。

10-06 05:23