时间戳值落后4小时

时间:2015-02-27 19:49:08

标签: python timestamp

我有字符串"20150219-0700"来表示时间。我想以毫秒为单位获取此值的时间戳。我做的是:

extracted_ts = "20150219-0700"

int_ts = int(datetime.datetime.strptime(extracted_ts, "%Y%m%d-%H%M").timestamp()) * 1000

但输出为1424358000000。它落后了4个小时

正确的输出应为1424329200000

3 个答案:

答案 0 :(得分:2)

timestamp方法调整从当前时区到UTC的时间。如果这不是您想要的,您可以使用timestamp documentation中的公式手动转换它:

int_ts = int((datetime.datetime.strptime(extracted_ts, "%Y%m%d-%H%M") - datetime.datetime(1970,1,1)).total_seconds()) * 1000

答案 1 :(得分:2)

由于您使用的是python3,如何:

from datetime import datetime, timezone
s = "20150219-0700"
d = datetime.strptime(s, "%Y%m%d-%H%M").replace(tzinfo=timezone.utc)
print(int(d.timestamp() * 1000))

输出:

1424329200000

答案 2 :(得分:2)

如果将输入时间字符串解释为UTC时间,则会获得正确的时间戳。

注意:该结论仅基于与UTC一致的("20150219-0700", 1424329200000)对,但在一般情况下还不够,例如,如果输入时间字符串位于欧洲/伦敦时区,则会得到完全相同的结果( GMT+0000)现在有 utc偏移但在夏天它是一小时'BST+0100',即如果"20150619-0700",您的代码将错误一小时输入为'Europe/London',而不是UTC。

您必须知道将时间转换为POSIX时间戳的输入时区:

#!/usr/bin/env python3
from datetime import datetime, timedelta
import pytz # $ pip install pytz

Epoch = datetime(1970, 1, 1, tzinfo=pytz.utc)
tz = pytz.timezone('Europe/London') # input timezone

naive_dt = datetime.strptime("20150219-0700", "%Y%m%d-%H%M")
dt = tz.localize(naive_dt, is_dst=None) # make it aware
timestamp_millis = (dt - Epoch) // timedelta(milliseconds=1)
# -> 1424329200000

注意:后一个表达式可能会提供比int(dt.timestamp()*1000)int(diff.total_seconds()*1000)公式更精确的结果。请参阅Python问题中的讨论:timedelta.total_seconds needlessly inaccurate, especially for negative timedeltas例如," n/10**6n/1e6不是同一件事"

如果您确定输入时区是UTC,那么您可以将输入保留为天真的日期时间对象:

#!/usr/bin/env python3
from datetime import datetime

Epoch = datetime(1970, 1, 1)
utc_dt = datetime.strptime("20150219-0700", "%Y%m%d-%H%M")
timestamp_millis = (utc_dt - Epoch) // timedelta(milliseconds=1)