访问datetime对象的时区信息

时间:2018-04-02 13:16:05

标签: python datetime timezone

我可以像这样创建一个特定于时区的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由两个值/属性表示:timedelta和一个字符串。但是我怎样才能访问它们? 我想做这样的事情

d.tzinfo.delta
d.tzinfo.name

我需要这些信息才能(de)将日期时间序列化为JSON。

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

2 个答案:

答案 0 :(得分:2)

在这种情况下,

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()返回值可能时区因各种历史信息而异。

答案 1 :(得分:1)

您正在询问datetime.tzinfo,它是一个抽象基类,如文档here所述。

datetime附带了一个名为datetime.timezone的tzinfo抽象基类的实现,该基类记录为here

在最后一个链接的下方是timezone.utcoffset和timezone.utcname上的文档,如果它是时区,它们是访问您在tzinfo上询问的属性的方法。但是,这不是该抽象类的唯一实现。例如,如果您正在使用pytz时区,那么您需要阅读相关的文档。