Python datetime.astimezone()方法
datetime
模块是Python编程语言中的一个内置模块。这个库提供了可靠和高效的函数,用于处理日期、时间、时差和时区,并对它们进行各种计算。
这个模块包含了一个datetime
,该类将日期与时间和时区一起存储。这个类的对象可以访问不同的实例方法,如astimezone()
,返回一个带有时区信息的新datetime
对象。
Pythondatetime.astimezone()
方法的语法
<datetime object>.astimezone()
参数
类型 | 说明 | |
---|---|---|
tz |
tzinfo |
一个代表有效时区的tzinfo 对象。默认值是None 。 |
tzinfo
是一个抽象的基类,用于存储关于时区的详细信息。由于它是一个抽象的类,所以不能被实例化,一些具体的类必须实例化tzinfo
,并实现它的四个重要方法:utcoffset(dt)
,dst(dt)
,tzname(dt)
, 和fromutc(dt)
。
在这篇文章中,我们将不执行具体类的实际实现。相反,我们将使用已经将抽象的tzinfo
类和datetime
模块的timezone
类子类化的tz
模块。
要了解更多关于tzinfo
,它的方法,以及如何继承和实现它,请参考这里的官方 Python 文档。要深入了解tz
模块,请参考这里的官方文档。
返回
tzinfo
该方法返回一个新的datetime
对象,其属性类型为tz
。日期和时间值被调整为与时区有关的当地时间。
默认情况下,datetime
对象根据UTC或协调世界时来存储日期和时间。在现实世界的应用中,日期和时间被存储在UTC,而不是硬编码在服务器或用户的时区。
根据用户的位置和时区,日期和时间值被调整并呈现给用户。而且,将日期和时间从一个时区转换到另一个时区是非常直接的。
例1:使用astimezone
与tz
模块
from datetime import datetime
from dateutil import tz
dt = datetime.now()
t1 = tz.gettz("America/Los_Angeles")
t2 = tz.gettz("Asia/Kolkata")
t3 = tz.gettz("Asia/Singapore")
t4 = tz.gettz("Europe/Paris")
t5 = tz.gettz("Canada/Pacific")
print("UTC:", dt)
print("America/Los_Angeles:", dt.astimezone(t1))
print("Asia/Kolkata:", dt.astimezone(t2))
print("Asia/Singapore:", dt.astimezone(t3))
print("Europe/Paris:", dt.astimezone(t4))
print("Canada/Pacific:", dt.astimezone(t5))
输出:
UTC: 2022-08-24 12:30:45
America/Los_Angeles: 2022-08-24 05:30:45-07:00
Asia/Kolkata: 2022-08-24 18:00:45+05:30
Asia/Singapore: 2022-08-24 20:30:45+08:00
Europe/Paris: 2022-08-24 14:30:45+02:00
Canada/Pacific: 2022-08-24 05:30:45-07:00
上面的Python代码首先为当前时间创建一个datetime
对象。接下来,它创建了5个代表时区的对象,即America/Los_Angeles
,Asia/Kolkata
,Asia/Singapore
,Europe/Paris
, 和Canada/Pacific
。
所有这些对象的类型都是<class 'dateutil.zoneinfo.tzfile'>
。我们可以用Python内置的type()
方法来验证。
tzfile
是继承了抽象类tzinfo
的具体类,并实现了所有的关键方法。接下来,使用astimezone()
方法,5个有时间意识的datetime
对象被创建。
让我们将所有新的5个datetime
对象与基本的datetime
对象(UTC时区)进行比较。我们会发现,对于每一个时区感知对象,日期和时间都被调整为时区的当地时间。
根据时区标志,我们可以很容易地通过从UTC时间中添加或减去时间来验证。
例如,在America/Los_Angeles
的情况下,我们将从UTC中减去7小时(-07:00
),在Asia/Kolkata
的情况下,我们将在UTC中增加5小时30分钟(+05:30
),以得到当地时间。
例2:使用astimezone
与datetime.timezone
from datetime import datetime, timezone, timedelta
dt = datetime.now()
t1 = timezone(timedelta(hours = -7, minutes = 0), "America/Los_Angeles")
t2 = timezone(timedelta(hours = 5, minutes = 30), "Asia/Kolkata")
t3 = timezone(timedelta(hours = 8, minutes = 0), "Asia/Singapore")
t4 = timezone(timedelta(hours = 2, minutes = 0), "Europe/Paris")
t5 = timezone(timedelta(hours = 7, minutes = 0), "Canada/Pacific")
print("UTC:", dt)
print("America/Los_Angeles:", dt.astimezone(t1))
print("Asia/Kolkata:", dt.astimezone(t2))
print("Asia/Singapore:", dt.astimezone(t3))
print("Europe/Paris:", dt.astimezone(t4))
print("Canada/Pacific:", dt.astimezone(t5))
输出:
UTC: 2022-08-24 12:34:33.325235
America/Los_Angeles: 2022-08-24 05:34:33.325235-07:00
Asia/Kolkata: 2022-08-24 18:04:33.325235+05:30
Asia/Singapore: 2022-08-24 20:34:33.325235+08:00
Europe/Paris: 2022-08-24 14:34:33.325235+02:00
Canada/Pacific: 2022-08-24 05:34:33.325235-07:00
datetime.timezone
类以不同方式表示时区。它使用datetime.timedelta
来表示偏移。
除此以外,一切都与上一个例子中的相同。