一尘不染

等时格式的时区字段

python

我有一个时间戳应该在EST中:

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

返回:

2014-10-06T18:06:40-04:56

阅读 122

收藏
2020-12-20

共1个答案

一尘不染

问题是pytz

…不同于已记录的tzinfo实现的Python API;如果要创建本地时间,则需要使用本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,等等。要选择哪一个取决于您要执行的操作。例如:

>>> 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所说:

将天真的时间转换为本地时间。

此方法应用于构造本地时间,而不是将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只要求时区提供其偏移量,而不是在特定时间获取其偏移量,这就是它所得到的。


最后一件事:EST是东部标准时间,它是-05:00。那不是2014年10月6日在美国任何位置的时区,因为在2014年,美国的夏令时为11月2日。(印第安纳州曾经有一些县在夏季在EST上,但现在已经不存在了。)您要查找的是EDT,即东部夏令时,-04:00。或者,当然是ET,它是夏季的EDT,而冬季是EST,这是您通过查找'US/Eastern'或得到的结果'America/New_York'

2020-12-20