我有一个时间戳应该在EST中:
2014-10-06T18:06:40-04:56
我了解第一部分:2014-10-06T18:06:40,但不了解-04:56。
2014-10-06T18:06:40
-04:56
-04:56这里是什么意思?
这是我获得该时间戳记的方式:
import datetime start_time = datetime.datetime(year = 2014, month = 10, day = 6, hour = 18, tzinfo = pytz.timezone('US/Eastern')) end_time = start_time + datetime.timedelta(seconds=400)
接着:
end_time.isoformat()
返回:
问题是pytz:
pytz
…不同于已记录的tzinfo实现的Python API;如果要创建本地时间,则需要使用本localize()文档中介绍的方法…
localize()
再往下走,它说:
不幸的是,在许多时区中,使用标准datetime构造函数的tzinfo参数对pytz都不起作用。
>>> datetime(2002, 10, 27, 12, 0, 0, tzinfo=amsterdam).strftime(fmt) '2002-10-27 12:00:00 LMT+0020'
因此,您需要按照文档的建议进行操作-使用normalize,构造UTC时间和使用astimezone,等等。要选择哪一个取决于您要执行的操作。例如:
normalize
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所说:
localize
将天真的时间转换为本地时间。 此方法应用于构造本地时间,而不是将tzinfo参数传递给datetime构造函数。
将天真的时间转换为本地时间。
此方法应用于构造本地时间,而不是将tzinfo参数传递给datetime构造函数。
我认为构建本地时间正是您想要的。
如果您想知道 为什么 ……那么,如果您查看一下奥尔森数据库中的数据,或者只是打印出eastern._utcoffset,您将看到-1天,+ 68640分钟。那是19.0166+小时,而不是19小时。为什么?因为每个时区都以其起始偏移量进行定义,并从那里进行调整。东部地区基于1883年11月18日纽约时区,当时是格林尼治标准时间-04:56:02。从1920年开始对日期进行了调整,减去了额外的00:03:58。当然,DST的年度调整来回一小时。因此,截至目前,东部地区是-04:00,但不知道它应该代表什么日期,所以是-04:56。而且,因为datetime只要求时区提供其偏移量,而不是在特定时间获取其偏移量,这就是它所得到的。
eastern._utcoffset
datetime
最后一件事:EST是东部标准时间,它是-05:00。那不是2014年10月6日在美国任何位置的时区,因为在2014年,美国的夏令时为11月2日。(印第安纳州曾经有一些县在夏季在EST上,但现在已经不存在了。)您要查找的是EDT,即东部夏令时,-04:00。或者,当然是ET,它是夏季的EDT,而冬季是EST,这是您通过查找'US/Eastern'或得到的结果'America/New_York'。
'US/Eastern'
'America/New_York'