我正在使用 pytz 模块使用以下代码将日期从 America/Los_Angeles 时区转换为 UTC:
TZ = 'America/Los_Angeles'
from = pytz.timezone(TZ)
utc = from.localize(original_date).astimezone(pytz.utc)
现在,我想测试 UTC 值是否实际上是 UTC 格式。如何使用 pytz 或 datetime 做到这一点?
utc.tzinfo == pytz.utc # returns True if utc in UTC
示例:
now = datetime.datetime.now(pytz.utc)
now.tzinfo == pytz.utc # returns True
now = now.astimezone(pytz.timezone('America/Los_Angeles'))
now.tzinfo == pytz.utc # returns False
接受的答案不适用于除
pytz
对象之外的任何其他对象。由于 pytz
实际上在进行转换方面相当糟糕 [1](例如,正确执行夏令时等),因此最好进行交叉实现检查。
now = datetime.datetime.now(pytz.utc)
if now.tzinfo:
now.utcoffset().total_seconds() == 0 # returns true
[1] https://pendulum.eustace.io/blog/a-faster-alternative-to-pyz.html
你可以简单地这样做:
from datetime import datetime, timezone
lunch_time = datetime.now(timezone.utc)
if lunch_time.format('%Z') == 'UTC':
print("Eat food")
这也适用于简单的时间对象,因为
lunch_time.format('%Z')
将返回一个空字符串。此方法也适用于 pytz 或任何其他模块,因为您只是将时区检查为字符串而不是对象(接受的答案不适用于上述时区模块情况,仅适用于 pytz)。
from datetime import datetime
import pytz
dinner_time = datetime.now(pytz.timezone('UTC'))
if dinner_time.format('%Z') == 'UTC':
print("Hungry!")
注意:这也将消除时区是 GMT 时区而不是 UTC 时区的可能性。另一个答案
now.utcoffset().total_seconds() == 0
对于 GMT 来说是正确的,但这可能不是您想要的。
%Z 说明符记录在此处:
https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
与之前的答案类似,你可以这样做:
如果您有给定的日期时间对象,您需要首先使用 strftime() 方法将其转换为字符串,然后传入 %Z 说明符,该说明符给出时区名称,根据返回“(empty)、UTC、GMT”之一到文档。
所以一个例子是:
def check_if_utc(my_datetime):
return my_datetime.strftime('%Z') == 'UTC'