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
的实例。这个方法接受两个参数。
-
offset
:一个时区的时间偏移。它的类型应该是timedelta
。要阅读更多关于timedelta
,请参考这里的官方文档。 -
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
其中±
是偏移量的符号,HH
和MM
分别是offset.hours
和offset.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
对象。