我在使用时区时有不寻常的经验。我必须将python datetime对象格式化为iso8601
格式。在linux date --iso-8601=s
中会给你结果:2017-12-11T12:30:07+03:30
。在python中,我尝试使用isoformat
方法而不设置任何时区:
>>> datetime.datetime(year=2017, month=1, day=1, hour=12, minute=44, second=25, microsecond=0).isoformat()
但它返回'2017-01-01T12:44:25'
,它不包含与UTC的时差;我想因为它是一个天真的日期时间对象。我尝试使用显式时区:
>>> datetime.datetime(year=2017, month=1, day=1, hour=12, minute=44, second=25, microsecond=0, tzinfo=pytz.timezone('Asia/Tehran')).isoformat()
但令人惊讶的是我得到'2017-01-01T12:44:25+03:26'
落后4分钟。
我使用命令date +'%:z %Z'
检查了我的计算机时区,输出为+03:30 +0330
。有关命令Iran
和Asia/Tehran
的时区名称分别为find /usr/share/zoneinfo/* -type f -exec sh -c "diff -q /etc/localtime '{}' > /dev/null && echo {}" \
和cat /etc/timezone
。
另一方面,我检查了pytz.timezone
和Iran
时区名称的方法Asia/Tehran
的结果;我在两种情况下都得到LMT+3:26:00 STD
。我可以使用tzoffset
和12600作为时差秒,但夏令时会影响到这一点;我想独立于。
我也试图找到偏移秒:
>>> d = datetime.datetime(year=2017, month=1, day=1, hour=12, minute=44, second=25, microsecond=0, tzinfo=pytz.timezone('Asia/Tehran'))
>>> tzlocal.get_localzone().utcoffset(d)
datetime.timedelta(0, 12360)
没有时区:
>>> d = datetime.datetime(year=2017, month=1, day=1, hour=12, minute=44, second=25, microsecond=0)
>>> tzlocal.get_localzone().utcoffset(d)
datetime.timedelta(0, 12600)
但正如我所提到的,如果我没有设定时区,我就无法与isoformat
获得时差。
我有两个问题: