我使用pytz模块将日期从美国/洛杉矶时区转换为UTC,使用下面的代码:
TZ = 'America/Los_Angeles'
from = pytz.timezone(TZ)
utc = from.localize(original_date).astimezone(pytz.utc)
现在,我想测试UTC值是否实际上是UTC格式。如何使用pytz或datetime ?
接受的答案将不适用于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
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
您可以简单地这样做:
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或任何其他模块一起工作,因为您只是将时区作为字符串而不是作为对象进行检查(接受的答案将不适用于上述timezone模块情况,仅适用于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为True,这可能不是你想要的。
%Z说明符记录在这里:
https://docs.python.org/3/library/datetime.html strftime-and-strptime-behavior
与上一个答案类似,您可以这样做:
如果你有一个给定的datetime对象,你想首先用strftime()方法将其转换为字符串,然后传入%Z说明符,该说明符给出时区名称,根据文档返回'(empty), UTC, GMT'之一。
一个例子是:
def check_if_utc(my_datetime):
return my_datetime.strftime('%Z') == 'UTC'