我需要将时间戳转换为纪元值。我发现我的系统时区设置为 CET,我的 my-sql 数据库也使用该时区。
我试过这个:
os.environ['TZ']='UTC'
epoch = int(time.mktime(time.strptime('2017-02-22 17:04:06', '%Y-%m-%d %H:%M:%S')))
print(epoch)
#Output: 1487779446 -> not the same compared to 1487779446000 (= '2017-02-22 17:04:06')
print(time.strftime('%m/%d/%Y %H:%M:%S', time.gmtime(epoch/1000.)))
#Output: 01/18/1970 05:16:19 -> Not Correct!
# Timestamp: '2017-02-22 17:04:06'
print(time.strftime('%m/%d/%Y %H:%M:%S', time.gmtime(1487779446000/1000.)))
#Output: 02/22/2017 16:04:06 -> Correct!
我也用 CET 尝试过这个,结果相同。我不明白为什么我得到不同的价值观。
自纪元以来获得秒数的一个好方法是明确地执行此操作。此函数将时间字符串转换为朴素datetime
,使datetime
时区感知,然后减去 UTC 时纪元的datetime
。
法典:
import datetime as dt
from pytz import timezone
def convert_timestamp_to_utc_epoch(ts, tz_info):
# convert timestamp string to naive datetime
naive = dt.datetime.strptime(ts, '%Y-%m-%d %H:%M:%S')
# assign proper timezone to datetime
aware = tz_info.localize(naive)
# get a datetime that is equal to epoch in UTC
utc_at_epoch = timezone('UTC').localize(dt.datetime(1970,1,1))
# return the number of seconds since epoch
return (aware - utc_at_epoch).total_seconds()
测试代码:
使用问题中的示例:
print('CET:',
convert_timestamp_to_utc_epoch('2017-02-22 17:04:06', timezone('CET')))
结果:
CET: 1487779446.0
获取任意本地时区:
如果您不确定本地计算机使用的是哪个时区,则可以像以下方式使用tzlocal
库:
from tzlocal import get_localzone
local_tz = get_localzone()
print('Local:',
convert_timestamp_to_utc_epoch('2017-02-22 17:04:06', local_tz))
print('Pacific:',
convert_timestamp_to_utc_epoch('2017-02-22 17:04:06', timezone('US/Pacific')))
结果:
Local: 1487811846.0
Pacific: 1487811846.0