我有字符串"20150219-0700"
来表示时间。我想以毫秒为单位获取此值的时间戳。我做的是:
extracted_ts = "20150219-0700"
int_ts = int(datetime.datetime.strptime(extracted_ts, "%Y%m%d-%H%M").timestamp()) * 1000
但输出为1424358000000
。它落后了4个小时
正确的输出应为1424329200000
答案 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**6
和n/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)