📜  Python – datetime.tzinfo()

📅  最后修改于: 2022-05-13 01:55:29.393000             🧑  作者: Mango

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 个元素的元组进行检查,如下所示:

编写一个私有函数是为了根据这 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 一起使用。它返回值如下:

将此代码添加到类后, 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