如果你知道你的原始时区和你想将它转换成的新时区,结果是非常简单的:
-
制作两个pytz.timezone 对象,一个用于当前时区,一个用于新时区,例如pytz.timezone("US/Pacific")。您可以在pytz 库中找到所有官方时区的列表:import pytz; pytz.all_timezones
-
将感兴趣的日期时间/时间戳本地化到当前时区,例如
current_timezone = pytz.timezone("US/Eastern")
localized_timestamp = current_timezone.localize(timestamp)
- 在步骤 2 中新本地化的日期时间/时间戳上使用
.astimezone() 转换为新时区,并将所需时区的 pytz 对象作为输入,例如localized_timestamp.astimezone(new_timezone)。
完成!
作为一个完整的例子:
import datetime
import pytz
# a timestamp I'd like to convert
my_timestamp = datetime.datetime.now()
# create both timezone objects
old_timezone = pytz.timezone("US/Eastern")
new_timezone = pytz.timezone("US/Pacific")
# two-step process
localized_timestamp = old_timezone.localize(my_timestamp)
new_timezone_timestamp = localized_timestamp.astimezone(new_timezone)
# or alternatively, as an one-liner
new_timezone_timestamp = old_timezone.localize(my_timestamp).astimezone(new_timezone)
奖励:但如果您只需要特定时区的当前时间,您可以方便地将该时区直接传递到 datetime.now() 以直接获取当前时间:
datetime.datetime.now(new_timezone)
当涉及到一般需要时区转换时,我强烈建议您将数据库中的所有时间戳都以 UTC 格式存储,因为它没有夏令时 (DST) 转换。作为一种好的做法,应该始终选择启用时区支持(即使您的用户都在一个时区中!)。这将帮助您避免困扰当今众多软件的 DST 转换问题。
除了夏令时,软件时间通常会非常棘手。要了解在软件中处理时间有多么困难,这里有一个可能很有启发性的资源:@987654321@
即使是将日期时间/时间戳转换为日期这样看似简单的操作也可能变得不明显。正如this helpful documentation 指出的那样:
日期时间表示时间点。这是绝对的:它不依赖于任何东西。相反,日期是一个日历概念。这是一个时间段,其范围取决于考虑日期的时区。如您所见,这两个概念根本不同。
了解这种差异是避免基于时间的错误的关键一步。祝你好运。