Python 日期时间:将 strftime() 与可识别时区的日期一起使用

Python Datetime : use strftime() with a timezone-aware date

假设我的日期 d 是这样的:

>>> d 
datetime(2009, 4, 19, 21, 12, tzinfo=tzoffset(None, -7200))

可以看到,是"timezone aware",有2小时的偏移量,utctime是

>>> d.utctimetuple() 
time.struct_time(tm_year=2009, tm_mon=4, tm_mday=19, 
                 tm_hour=23, tm_min=12, tm_sec=0, 
                 tm_wday=6, tm_yday=109, tm_isdst=0)

所以,真正的 UTC 日期是 2009 年 3 月 19 日 23:12:00,对吗?

现在我需要用字符串格式化我的日期,我使用

>>> d.strftime('%Y-%m-%d %H:%M:%S.%f') 
'2009-04-19 21:12:00.000000'

这似乎没有考虑到这个偏移量。如何解决?

原因是 python 实际上格式化了您的日期时间对象,而不是某些 "UTC at this point of time"

要在格式中显示时区,请使用 %z%Z

寻找strf docs了解详情

这会将您的本地时间转换为 UTC 时间并打印出来:

import datetime, pytz
from dateutil.tz.tz import tzoffset

loc = datetime.datetime(2009, 4, 19, 21, 12, tzinfo=tzoffset(None, -7200))

print(loc.astimezone(pytz.utc).strftime('%Y-%m-%d %H:%M:%S.%f') )

(http://pytz.sourceforge.net/)

除了@Slam 已经回答的内容:

如果想输出UTC时间不带任何偏移量,可以

from datetime import timezone, datetime, timedelta
d = datetime(2009, 4, 19, 21, 12, tzinfo=timezone(timedelta(hours=-2)))
d.astimezone(timezone.utc).strftime('%Y-%m-%d %H:%M:%S.%f')

请参阅 Python 文档中的 datetime.astimezone

我无法导入时区模块(也没有太多时间了解原因) 所以我设置了覆盖/etc/localtime信息

的TZ环境变量
>>> import os
>>> import datetime
>>> print  datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
2019-05-17 11:26
>>> os.environ["TZ"] = "UTC"
>>> print  datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
2019-05-17 09:26