Python Datetime:将strftime()与时区感知日期一起使用

Python Datetime:将strftime()与时区感知日期一起使用,python,datetime,utc,Python,Datetime,Utc,假设我有日期d如下: >>> d datetime(2009, 4, 19, 21, 12, tzinfo=tzoffset(None, -7200)) 正如你所看到的,它是“时区感知的”,有一个2小时的偏移量,utctime是 >>> d.utctimetuple() time.struct_time(tm_year=2009, tm_mon=4, tm_mday=19, tm_hour=23, tm_min=12,

假设我有日期
d
如下:

>>> d 
datetime(2009, 4, 19, 21, 12, tzinfo=tzoffset(None, -7200))
正如你所看到的,它是“时区感知的”,有一个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日12:00,对吗

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

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

这似乎没有考虑到这个补偿。如何解决这个问题

原因是python实际上正在格式化datetime对象,而不是某些“此时的UTC”

要以格式显示时区,请使用
%z
%z


查找详细信息

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

()

除了@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文档。

我无法导入时区模块(而且没有太多时间知道原因) 所以我设置了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

如何在Python2.7中实现这一点?没有
timezone
模块那里的
timezone
是用于Python 3的。Python2.7是EOL,您应该升级到Python3.8。@wyz23x2设备操作系统被锁定得太多,我没有其他选择。