时间戳值落后 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**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)
我有字符串 "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**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)