如果您知道您的原始时区和要将其转换到的新时区,则结果非常简单:
-
做两个pytz.timezone
对象,一个用于当前时区,一个用于新时区,例如pytz.timezone("US/Pacific")
。您可以找到所有官方时区的列表pytz
图书馆:import pytz; pytz.all_timezones
-
将感兴趣的日期时间/时间戳本地化为当前时区,例如
current_timezone = pytz.timezone("US/Eastern")
localized_timestamp = current_timezone.localize(timestamp)
- 使用转换为新时区
.astimezone()
在步骤 2 中新本地化的日期时间/时间戳上,使用所需时区的 pytz 对象作为输入,例如localized_timestamp.astimezone(new_timezone)
.
Done!
作为一个完整的例子:
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 转换问题。
除了夏令时之外,软件中的时间通常非常棘手。为了了解在一般软件中处理时间有多么困难,这里有一个可能具有启发性的资源:http://yourcalendricalfallacyis.com
即使将日期时间/时间戳转换为日期这样看似简单的操作也可能变得不那么明显。作为这个有用的文档指出:
一个日期时间代表一个时间点。这是绝对的:它不依赖于任何东西。相反,日期是一个日历概念。这是一段时间,其范围取决于考虑日期的时区。正如您所看到的,这两个概念根本不同。
了解这种差异是避免基于时间的错误的关键一步。祝你好运。