Python Datetime:使用strftime()和时区感知日期

时间:2018-02-10 19:48:43

标签: python datetime utc

假设我有这样的日期-e

d

正如你所看到的,它是"时区感知",有2小时的偏移,utctime是

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

所以,实际的UTC日期是2009年3月19日 23 :12:00,对吧?

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

>>> 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)

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

4 个答案:

答案 0 :(得分:2)

除了@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

答案 1 :(得分:1)

原因是python实际上格式化了你的日期时间对象,而不是某些“此时的UTC”

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

查找strf docs了解详情

答案 2 :(得分:1)

这会将您的本地时间转换为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/

答案 3 :(得分:0)

我无法导入时区模块(也没有太多时间知道原因) 所以我设置了TZ环境变量来覆盖/ etc / localtime信息

>>> 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