Python datetime.timezone类

datetime 模块是Python编程语言中的一个内置模块。这个库提供了几个类来表示与日期和时间有关的量,例如:date 来表示一个日期,datetime 来表示日期和时间的组合,timedelta 来表示一个时间差,timezone 来描述一个时区。

timezone 类是tzinfo 类的一个子类,而 是一个抽象类,只能被继承。要了解tzinfo 类,请参考这里的官方文档。

tzinfo 类在表示地标的时区方面失败了,因为一年中的不同日子使用不同的时间偏移。此外,它也不能代表那些在历史上对民用时间有变化的地方的时区。

timezone 类实现了5 的重要方法和1 的属性,其内容如下。

语法

datetime.timezone()

参数

类型 细节
offset timedelta 时区的UTC偏移量表示为一个timedelta 对象。
name 字符串 一个时区的名称。

返回值

由于它是一个类,它不返回任何东西,但是它的构造函数会创建一个timezone 对象。

Pythondatetime.timezone 类的方法

抽象类tzinfo 包含五个方法,继承类必须实现。幸运的是,timezone 类实现了它们,它们如下。

timezone(offset, name=None)

timezone 是一个构造函数,用于创建类timezone 的实例。这个方法接受两个参数。

  1. offset:一个时区的时间偏移。它的类型应该是timedelta 。要阅读更多关于timedelta ,请参考这里的官方文档。
  2. name:一个字符串的时区名称。默认情况下,它被设置为None

注意,timedelta 应该在-timedelta(hours = 24)timedelta(hours = 24) 之间;否则,会产生一个ValueError

由于timezone 是抽象类tzinfo 的子类,我们可以使用它的对象来创建认识时区的datetime 对象。请参考下面的Python代码。

import datetime
dt = datetime.datetime(2022, 8, 25, 8, 41, 33, 234875)
tm1 = datetime.timezone(datetime.timedelta(hours = 5, minutes = 30), name = "Asia/Kolkata")
tm2 = datetime.timezone(datetime.timedelta(hours = 2), name = "CET")
tm3 = datetime.timezone(datetime.timedelta(hours = 8), name = "Asia/Singapore")
dt1 = dt.astimezone(tm1)
dt2 = dt.astimezone(tm2)
dt3 = dt.astimezone(tm3)
print("Asia/Kolkata:", dt1)
print("CET:", dt2)
print("Asia/Singapore:", dt3)

输出:

Asia/Kolkata: 2022-08-25 14:11:33.234875+05:30
CET: 2022-08-25 10:41:33.234875+02:00
Asia/Singapore: 2022-08-25 16:41:33.234875+08:00

timezone.utcoffset(dt)

该方法返回一个timezone 对象的时区偏移或UTC偏移。注意,dt 参数是强制性的,内部会忽略。

所以,我们可以为它传递一个None 的值。该方法返回一个timedelta 对象,其值等于当地时间和UTC之间的差值。

请参考下面的Python代码,了解一个例子。

import datetime
dt = datetime.datetime(2022, 8, 25, 8, 41, 33, 234875)
tm1 = datetime.timezone(datetime.timedelta(hours = 5, minutes = 30), name = "Asia/Kolkata")
tm2 = datetime.timezone(datetime.timedelta(hours = 2), name = "CET")
tm3 = datetime.timezone(datetime.timedelta(hours = 8), name = "Asia/Singapore")
dt1 = dt.astimezone(tm1)
dt2 = dt.astimezone(tm2)
dt3 = dt.astimezone(tm3)
print("Asia/Kolkata:", dt1)
print("CET:", dt2)
print("Asia/Singapore:", dt3)
print("nUTC Offsetsn")
print(tm1.utcoffset(None)) # here
print(tm2.utcoffset(None)) # here
print(tm3.utcoffset(None)) # here

输出:

Asia/Kolkata: 2022-08-25 14:11:33.234875+05:30
CET: 2022-08-25 10:41:33.234875+02:00
Asia/Singapore: 2022-08-25 16:41:33.234875+08:00
UTC Offsets
5:30:00
2:00:00
8:00:00

timezone.tzname(dt)

该方法返回timezone 对象中设置的时区名称。如果没有给构造函数赋值,它将被设置为None

对于一个None 的值,时区的名称由tzname(dt) 使用offset 来解决。如果偏移量是timedelta(0) ,返回的名称是"UTC"

对于其他情况,遵循以下格式。

UTC±HH:MM

其中± 是偏移量的符号,HHMM 分别是offset.hoursoffset.minutes 的两个数字。

请参考下面的Python代码,以获得一个例子。

import datetime
dt = datetime.datetime(2022, 8, 25, 8, 41, 33, 234875)
tm1 = datetime.timezone(datetime.timedelta(hours = 5, minutes = 30), name = "Asia/Kolkata")
tm2 = datetime.timezone(datetime.timedelta(hours = 2), name = "CET")
tm3 = datetime.timezone(datetime.timedelta(hours = 8), name = "Asia/Singapore")
dt1 = dt.astimezone(tm1)
dt2 = dt.astimezone(tm2)
dt3 = dt.astimezone(tm3)
print("Asia/Kolkata:", dt1)
print("CET:", dt2)
print("Asia/Singapore:", dt3)
print("nTimezone Namesn")
print(tm1.tzname(None))
print(tm2.tzname(None))
print(tm3.tzname(None))

输出:

Asia/Kolkata: 2022-08-25 14:11:33.234875+05:30
CET: 2022-08-25 10:41:33.234875+02:00
Asia/Singapore: 2022-08-25 16:41:33.234875+08:00
Timezone Names
Asia/Kolkata
CET
Asia/Singapore

timezone.dst(dt)

这个方法不做任何事情;它总是返回None 。请参考下面的Python代码中的一个例子。

import datetime
dt = datetime.datetime(2022, 8, 25, 8, 41, 33, 234875)
tm1 = datetime.timezone(datetime.timedelta(hours = 5, minutes = 30), name = "Asia/Kolkata")
tm2 = datetime.timezone(datetime.timedelta(hours = 2), name = "CET")
tm3 = datetime.timezone(datetime.timedelta(hours = 8), name = "Asia/Singapore")
dt1 = dt.astimezone(tm1)
dt2 = dt.astimezone(tm2)
dt3 = dt.astimezone(tm3)
print("Asia/Kolkata:", dt1)
print("CET:", dt2)
print("Asia/Singapore:", dt3)
print("nDST")
print(tm1.dst(None))
print(tm2.dst(None))
print(tm3.dst(None))

输出:

Asia/Kolkata: 2022-08-25 14:11:33.234875+05:30
CET: 2022-08-25 10:41:33.234875+02:00
Asia/Singapore: 2022-08-25 16:41:33.234875+08:00
DST
None
None
None

timezone.fromutc(dt)

该方法返回dt + offset 。注意,dt 必须是一个datetime 对象,其tzinfo 应该被设置为self

请参考下面的Python代码作为例子。

import datetime
dt = datetime.datetime(2022, 8, 25, 8, 41, 33, 234875)
tm1 = datetime.timezone(datetime.timedelta(hours = 5, minutes = 30), name = "Asia/Kolkata")
tm2 = datetime.timezone(datetime.timedelta(hours = 2), name = "CET")
tm3 = datetime.timezone(datetime.timedelta(hours = 8), name = "Asia/Singapore")
dt1 = dt.astimezone(tm1)
dt2 = dt.astimezone(tm2)
dt3 = dt.astimezone(tm3)
print("Asia/Kolkata:", dt1)
print("CET:", dt2)
print("Asia/Singapore:", dt3)
print("nFrom UTCn")
print(tm1.fromutc(dt1))
print(tm2.fromutc(dt2))
print(tm3.fromutc(dt3))

输出:

Asia/Kolkata: 2022-08-25 14:11:33.234875+05:30
CET: 2022-08-25 10:41:33.234875+02:00
Asia/Singapore: 2022-08-25 16:41:33.234875+08:00
From UTC
2022-08-25 19:41:33.234875+05:30
2022-08-25 12:41:33.234875+02:00
2022-08-26 00:41:33.234875+08:00

timezone.utc

该属性存储UTC或协调世界时。更正式地说,它存储了timezone(timedelta(0)) 的值。

请参考下面的Python代码的例子。

import datetime
print(datetime.timezone.utc)

输出:

UTC

例子1:认识时区的datetime 对象

import datetime
dt = datetime.datetime(2022, 9, 11, 12, 45, 59, 993842)
tm = datetime.timezone(datetime.timedelta(hours = 5, minutes = 30), name = "IST")
dtAware = dt.astimezone(tm)
print("Naive DateTime Object:", dt)
print("Timezone-Aware DateTime Object:", dtAware)

输出:

Naive DateTime Object: 2022-09-11 12:45:59.993842
Timezone-Aware DateTime Object: 2022-09-11 18:15:59.993842+05:30

上面的 Python 代码首先创建了一个天真的datetime 对象。接下来,在timezone 类的帮助下,它创建了IST时区,也就是UTC+05:30

接下来,使用datetime 对象上可用的astimezone() 方法,它创建了一个新的datetime 对象,该对象具有时区意识。注意,日期和时间值会根据新对象中的时区进行调整。

由于IST比UTC早5 小时和30 分钟,所以时间被增加了5 小时和30 分钟。

例2:考虑时区的time 对象

import datetime
tm = datetime.timezone(datetime.timedelta(hours = 5, minutes = 30), name = "IST")
t = datetime.time(12, 45, 59, 993842, tm)
print("Timezone-Aware Time Object:", t)

输出:

Timezone-Aware DateTime Object: 12:45:59.993842+05:30

上面的Python代码首先使用timezone 类创建IST时区。接下来,它使用time 类创建了一个时区感知的time 对象。