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:使用astimezonetz 模块

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:使用astimezonedatetime.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 来表示偏移。

除此以外,一切都与上一个例子中的相同。