问题是pytz http://pytz.sourceforge.net/:
...与 tzinfo 实现的已记录的 Python API 不同;如果你想创建本地挂钟时间,你需要使用localize()
本文档中记录的方法...
再往下说:
不幸的是,对于许多时区,使用标准日期时间构造函数的 tzinfo 参数对 pytz 来说“不起作用”。
>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt)
'2002-10-27 12:00:00 LMT+0020'
因此,您需要按照文档的建议进行操作 - 使用normalize
,构建 UTC 时间并使用astimezone
等等。您想要哪一个取决于您想要做什么。例如:
>>> from datetime import datetime
>>> from pytz import timezone
>>> utc = timezone('UTC')
>>> eastern = timezone('US/Eastern')
>>> datetime(2014, 10, 6, 18, tzinfo=eastern).isoformat()
'2014-10-06T18:00:00-04:56'
>>> eastern.normalize(datetime(2014, 10, 6, 18, tzinfo=eastern)).isoformat()
'2014-10-06T18:56:00-04:00'
>>> datetime(2014, 10, 6, 18, tzinfo=utc).astimezone(eastern).isoformat()
'2014-10-06T14:00:00-04:00'
>>> eastern.localize(datetime(2014, 10, 6, 18)).isoformat()
'2014-10-06T18:00:00-04:00'
我想这是你最后想要的。作为文档localize
say:
将天真时间转换为当地时间。
该方法应该用于构造本地时间,而不是
而不是将 tzinfo 参数传递给日期时间构造函数。
我认为构建当地时间正是您想要的。
如果你想知道why…好吧,如果您查看 Olson 数据库中的数据,或者只是打印出来eastern._utcoffset
,您会看到 -1 天,+68640 分钟。那是 19.0166+ 小时,而不是 19。为什么?因为每个时区都是以其起始偏移量定义的,并从那里进行调整。东部时间基于截至 1883 年 11 月 18 日 12:03:58 的纽约时区,此时距 GMT 为 -04:56:02。对 1920 年开始的日期进行了调整,减去了额外的 00:03:58。当然,每年夏令时也会来回调整一小时。因此,截至目前,东部时间是 -04:00,但不知道它应该代表什么日期,它是 -04:56。并且,因为datetime
只是询问时区的偏移量,而不是特定时间的偏移量,这就是它得到的。
最后一件事:EST 是东部标准时间,即 -05:00。这不是2014年10月6日美国任何地点的时区,因为2014年美国夏令时到11月2日。 (印第安纳州曾经有一些县在夏季采用 EST,但现在已经不再如此。)您要查找的是 EDT(东部夏令时间),即 -04:00。或者,当然,ET,夏季是 EDT,冬季是 EST,这是你通过查找得到的'US/Eastern'
or 'America/New_York'
.