Python datetime与时间戳的转换
经过一番努力和阅读,我写出了以下两个函数,其中一个是另一个的完全反向操作。第一个函数接收一个Python的日期时间对象(没有时区信息),然后把它转换成自1970年1月1日以来的秒数;而另一个函数则是做相反的操作:
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) 有没有办法让时间戳变成浮点数,而不是calendar.timegm()返回的整数秒数?
1 个回答
4
1) 有没有更简单的方法来实现同样的功能(特别是第二个功能),而不需要导入三个不同的模块?我之前找到的简单解决方案有个缺陷,就是在区分我电脑上的本地时间和UTC时间时不够一致。
2) 有没有办法让时间戳变成浮点数,而不是
calendar.timegm()
返回的整数秒数?
calendar.timegm()
只适用于UTC时间。一个更简单的返回浮点数的版本就是:
seconds_since_epoch = (dt - datetime(1970, 1, 1)).total_seconds()
如果dt
是本地时间,这两种方法都不适用(在这种情况下,你可以使用time.mktime() + dt.microsecond / 1e6
)。要记住,本地时间可能会有歧义或根本不存在(例如,由于夏令时的变化)。而且,使用浮点数时可能会失去精度。
要转换回去:
dt = datetime(1970, 1, 1) + timedelta(seconds=seconds_since_epoch)
结果是dt
——一个表示UTC时区时间的简单日期时间对象。
如果你想得到本地时间,可以使用:
local_dt = datetime.fromtimestamp(seconds_since_epoch)
后者和time.mktime()
在time.gmtime(0)
等于1970-01-01 00:00:00+00:00
(POSIX纪元)时工作正常(接受/返回POSIX时间戳)。