时间戳值落后 4 小时

Timestamp value behind by 4 hours

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

extracted_ts = "20150219-0700"

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

但是输出是 1424358000000。晚了4个小时

正确的输出应该是1424329200000

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

既然你用的是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

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

注意:该结论仅基于与 UTC 一致的 ("20150219-0700", 1424329200000) 对,但在一般情况下还不够,例如,如果输入时间字符串在 [=36] 中,您将得到完全相同的结果=] 时区 (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)