Python – datetime.tzinfo()
DateTime 类提供了各种函数来操作日期和时间间隔。您在datetime.now()
中使用的 DateTime 对象实际上是 DateTime 类的对象。这些对象帮助我们使用日期和时间的函数。
注意:有关详细信息,请参阅Python日期时间模块和示例
日期时间.tzinfo()
datetime.now()
没有关于时区的任何信息。它只使用当前系统时间。在某些情况下,可能需要时区详细信息。在这种情况下,使用tzinfo抽象类。 tzinfo 是一个抽象基类。它不能直接实例化。一个具体的子类必须派生它并实现这个抽象类提供的方法。
tzinfo 类的实例可以传递给 datetime 和 time 对象的构造函数。它适用于将本地时间转换为 UTC 或考虑夏令时等情况。
天真和有意识的日期时间对象
不包含任何时区信息的日期时间对象被称为天真的日期时间对象。对于一个简单的 datetime 对象, datetime_object.tzinfo
将为None
。 Aware datetime 对象包含嵌入其中的时区信息。
tzinfo 基类中可用于实现的方法有:
- utcoffset(自我,dt)
- dst(自我,dt)
- tzname(自我,dt)
- 来自utc(自我,DT)
utcoffset()
它返回作为参数传递的日期时间实例的偏移量。
这个偏移量是指什么?
它指的是时区偏移量,表示时区比协调世界时或世界时坐标 (UTC) 提前了多少小时。偏移量写为 +00:00。例如:对于亚洲/台北,写为 UTC +08:00。
它占用 datetime 对象的时间,并返回 datetime 对象中的时间与 UTC 中同一点的时间之间的差。它以 UTC 以东的分钟数返回偏移量。如果当地时间在 UTC 以西,则为负数。一般的实现形式如下:
For fixed offset :
def utcoff(self, dt):
return constant
For time aware objects :
def utcoffset(self, dt):
return self.stdoffset + self.dst(dt)
dst()
缩写为Day - light Saving Time。它表示在夏令时将时钟提前 1 小时,以便根据时钟晚点黑暗。它设置为开或关。它基于包含 9 个元素的元组进行检查,如下所示:
(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, 0)
编写一个私有函数是为了根据这 9 个元素返回 0、1 或 -1。在此基础上决定dst(self, dt)
的值。该函数是在定义dst()
的类中编写的。它写成:
def _isdst(self, dt):
tt = (dt.year, dt.month, dt.day,
dt.hour, dt.minute, dt.second,
dt.weekday(), 0, 0)
stamp = _time.mktime(tt)
tt = _time.localtime(stamp)
return tt.tm_isdst > 0
这里mktime()
获取这个元组并将其转换为自本地时间纪元以来经过的秒数。然后, tm_isdst()
与 mktime 一起使用。它返回值如下:
‘1’ – Daylight Saving ON
‘0’ – Daylight Saving OFF
‘-1’ – Daylight Saving information unknown
将此代码添加到类后, dst()
可以根据条件定义如下。
For fixed offset class :
def dst(self, dt):
return ZERO
For time aware objects :
def utcoffset(self, dt):
if self._isdst(dt):
return DSTOFFSET
else:
return STDOFFSET
名称()
这用于查找传递的日期时间对象的时区名称。它返回一个Python字符串对象。
例子:
import datetime as dt
from dateutil import tz
tz_string = dt.datetime.now(dt.timezone.utc).astimezone().tzname()
print("datetime.now() :", tz_string)
NYC = tz.gettz('Europe / Berlin')
dt1 = dt.datetime(2015, 5, 21, 12, 0)
dt2 = dt.datetime(2015, 12, 21, 12, 0, tzinfo = NYC)
print("Naive Object :", dt1.tzname())
print("Aware Object :", dt2.tzname())
datetime.now() : UTC
Naive Object : None
Aware Object : CET
来自utc()
此函数以 UTC 格式占用对象的日期和时间,并返回等效的本地时间。它主要用于调整日期和时间。它是从默认的datetime.astimezone()
实现中调用的。 dt.tzinfo 将作为 self 传递,dt 的日期和时间数据将作为等效的本地时间返回。
注意:如果 dt.tzinfo 不是 self 或/并且 dst() 是 None,它将引发ValueError
。
一般实现如下:
def fromutc(self, dt):
dt_offset = dt.utcoffset()
dt_dst = dt.dst()
delta = dt_offset - dt_dst
if delta:
dt += delta
dtdst = dt.dst()
if dtdst:
return dt + dtdst
else:
return dt