这里的“-04:56”是什么意思?
这意味着生成输入时间戳的代码存在问题,表明缺乏对
pytz
时区工作原理的理解。如果您认为只有UTC偏移量(
-04:56
)是错误的,但日期本身是东部时区的正确时间,则应进行解析时间操作:
from datetime import datetime, timedelta
import pytz
tz = pytz.timezone('America/New_York')
naive = datetime.strptime("2014-10-06T18:06:40-04:56"[:-6],
"%Y-%m-%dT%H:%M:%S")
start_time = tz.localize(naive, is_dst=None)
end_time = tz.normalize(start_time + timedelta(seconds=400))
print(start_time.isoformat())
print(end_time.isoformat())
- 你应该使用
tz.localize()
而不是直接赋值 tzinfo
属性
is_dst=None
断言输入的时间存在且是明确的
- 如果日期跨越夏令时边界,
tz.normalize()
是必要的
2014-10-06T18:06:40-04:00
2014-10-06T18:13:20-04:00
为什么需要使用localize()
和normalize()
,可以在pytz文档中查看相关内容(关于localize()
/normalize()
的部分是文档中的第一个注释)。
为什么在东部时区2014年的-04:56
UTC偏移值是错误的
由于夏令时转换或其他原因(如战争或某些政治家认为这是个好主意),同一地点的UTC偏移在不同时间可能会有所不同。例如,下面是美国东部可能出现的值:
>>> import pytz
>>> pytz.timezone('US/Eastern')
{(datetime.timedelta(-1, 72000),
datetime.timedelta(0, 3600),
'EWT'): <DstTzInfo 'US/Eastern' EWT-1 day, 20:00:00 DST>,
(datetime.timedelta(-1, 68640),
datetime.timedelta(0),
'LMT'): <DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>,
(datetime.timedelta(-1, 72000),
datetime.timedelta(0, 3600),
'EDT'): <DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>,
(datetime.timedelta(-1, 68400),
datetime.timedelta(0),
'EST'): <DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>,
(datetime.timedelta(-1, 72000),
datetime.timedelta(0, 3600),
'EPT'): <DstTzInfo 'US/Eastern' EPT-1 day, 20:00:00 DST>}
注意LMT tzinfo的UTC偏移量: timedelta(-1, 68640)
等于 '-4:56:00'
。获取它的方法是使用错误的代码:
#XXX BROKEN, DO NOT DO IT
>>> dt = datetime(2014, 10, 6, tzinfo=pytz.timezone('US/Eastern'))
>>> dt
datetime.datetime(2014, 10, 6, 0, 0, tzinfo=<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>)
>>> dt.isoformat()
2014-10-06T00:00:00-04:56
直接分配
tzinfo
不允许
pytz
为给定的时间选择正确的
tzinfo
,而是使用可用的随机
tzinfo
对象之一。您应该始终使用
tz.localize()
来附加正确的时区信息。
datetime
对象赋予东部标准时间时区(EST),无论是来自于pytz
、tzlocal
还是其他任何我能找到的内容,我都会得到预期的“-05:00”。当然,如果我想这样做,我总可以费心构造一个位于“-04:56”的时区并将其命名为EST,而Python或我所拥有的任何模块都不会注意到我在费力让自己困惑,但是...这并不容易。 - abarnert2014-10-06T23:02:40Z
。你从哪里得到这个时间戳?或者,是什么软件生成了该时间戳? - Robᵩ