经过相当大的努力和阅读,我想出了以下两个函数,其中一个函数(或者意图是)与另一个函数完全相反。第一个采用Python日期时间对象(天真)并将其转换为自纪元以来的整数秒;另一方则相反:
import datetime
import time
import calendar
def datetime2timestamp(dt):
''' Accepts a naive datetime object and converts it to a time in seconds since the start of 1970'''
return(calendar.timegm(dt.timetuple()))
def timestamp2datetime(ts):
''' Accepts a time in seconds since the start of 1970 and converts it to a naive datetime object'''
return(datetime.datetime.fromtimestamp(time.mktime(time.gmtime(ts))))
>>> dt = datetime.datetime(1970, 1, 1, 0, 0, 1)
>>> print dt
1970-01-01 00:00:01
>>> ts = datetime2timestamp(dt)
>>> print ts
1
>>> dt = timestamp2datetime(ts)
>>> print dt
1970-01-01 00:00:01
两个问题:
1)有没有办法更简单地完成同样的事情(特别是第二个功能)而不需要导入三个不同的模块?我之前发现的更简单的解决方案存在缺陷,即它们与我的计算机上的本地时间和UTC之间的区别不一致。
2)有没有办法让timestamp成为float而不是calendar.timegm()返回的整数秒?
答案 0 :(得分:3)
1)有没有办法完成同样的事情(特别是第二个 功能)更简单,无需导入三个 不同的模块?我之前发现的更简单的解决方案有 缺点是他们之间的区别不一致 我的电脑上的当地时间和UTC。
2)有没有办法让时间戳成为浮点而不是 calendar.timegm()返回的整数秒?
calendar.timegm()
仅适用于UTC时间。返回浮点数的简单版本只是:
seconds_since_epoch = (dt - datetime(1970, 1, 1)).total_seconds()
如果dt
是当地时间,则两者都无法工作(在这种情况下您可以使用time.mktime() + dt.microsecond / 1e6
。请记住,当地时间可能不明确或不存在(例如,到期)到DST过渡))。不要忘记,如果你使用花车,就会失去精确度。
转换回来:
dt = datetime(1970, 1, 1) + timedelta(seconds=seconds_since_epoch)
结果是dt
- 一个天真的日期时间对象,表示UTC时区的时间。
如果您想获得当地时间,那么您可以使用:
local_dt = datetime.fromtimestamp(seconds_since_epoch)
如果time.mktime()
为time.gmtime(0)
(POSIX Epoch),则后者和1970-01-01 00:00:00+00:00
正常工作(接受/返回POSIX时间戳)。