我应该如何打印 Python 中特定时区的时间?

How should I print the time in a specific timezone in Python?

这道题真的很简单,基本就是题目了。我在西澳

是的,pytz 和 datetime 模块是正确的选择:

import pytz
from datetime import datetime

timezone = 'Australia/Perth'
py_timezone = pytz.timezone(timezone)
current_datetime = datetime.now(py_timezone)

如果您需要查找特定时区,您可以在 pytz 中使用 all_timezones 属性,这将 return 列出所有时区。

import pytz
all_timezones = pytz.all_timezones

pytzlikely to be deprecated 的未来。

从 Python 3.9(目前处于测试阶段)开始,更新更好的方法是使用 zoneinfo 模块。

阿姆斯特丹现在时间:

from datetime import datetime
from zoneinfo import ZoneInfo

now = datetime.now(tz=ZoneInfo("Europe/Amsterdam"))

将一个时区的时间转换为另一个时区:

from datetime import datetime
from zoneinfo import ZoneInfo

dt = datetime(2020, 1, 1, 12, tzinfo=ZoneInfo("Asia/Ho_Chi_Minh"))
converted_dt = dt.astimezone(ZoneInfo("Africa/Windhoek"))

获取可用时区:

import zoneinfo

zoneinfo.available_timezones()

您已经可以在 Python 3.6+ 中将其与 backports.zoneinfo package 一起使用。

还需要注意的重要一点是,如果您只想拥有 本地 时间,即根据您 OS 的时区设置,您只需要 datetime.

from datetime import datetime
now = datetime.now()
# print(now)
# 2020-06-27 13:08:12.007814

now 将是一个天真的日期时间对象,即它不知道时区。 Python 默认情况下假定它属于您当地的时区(不是例如 UTC)。

您甚至可以在没有任何其他导入的情况下使其具有时区意识:

now = now.astimezone()
# print(now)
# 2020-06-27 13:08:12.007814+02:00 # I'm on CEST at the moment; UTC+2

如果您想实施不同的时区或更改时区,这里有一个示例如何使用 dateutil:

import dateutil
awst = dateutil.tz.gettz('Australia/Perth')
now_naive = datetime.now()
now_aware = now_naive.replace(tzinfo=awst)

print(now_aware.strftime('%a %d %b %Y %H:%M:%S %z %Z'))
# Sat 27 Jun 2020 17:08:53 +0800 AWST

# same time in another timezone:
cest = dateutil.tz.gettz('Europe/Berlin')
now_aware = now_aware.astimezone(cest)

print(now_aware.strftime('%a %d %b %Y %H:%M:%S %z %Z'))
# Sat 27 Jun 2020 11:08:53 +0200 CEST

对于Python 3.9 zoneinfo,方法基本相同,因此从dateutil 更改为zoneinfo 是可行的。