繁体   English   中英

Python日期时间到时间戳的转换以及返回

[英]Python datetime to timestamp conversion and back

经过大量的努力和阅读,我提出了以下两个函数,其中一个是(或打算是)另一个的确切逆。 第一个使用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)有没有一种方法可以使时间戳为float而不是calendar.timegm()返回的整数秒数?

1)是否有一种方法可以更简单地完成同一件事(尤其是第二个功能),而无需导入三个不同的模块? 我以前发现的更简单的解决方案存在一个缺陷,即它们与我的计算机上的本地时间和UTC之间的区别不一致。

2)有没有一种方法可以使时间戳为float而不是calendar.timegm()返回的整数秒数?

calendar.timegm()仅适用于UTC时间。 返回浮点数的更简单版本是:

seconds_since_epoch = (dt - datetime(1970, 1, 1)).total_seconds()

如果dt是本地时间,则两者都time.mktime() + dt.microsecond / 1e6在这种情况下,您可以使用time.mktime() + dt.microsecond / 1e6 。请记住,本地时间可能不明确或不存在(例如,由于DST转换) ))。 别忘了,如果使用浮子,则可能会失去精度。

转换回来:

dt = datetime(1970, 1, 1) + timedelta(seconds=seconds_since_epoch)

结果为dt天真的datetime对象,表示UTC时区中的时间。

如果您想获取当地时间,则可以使用:

local_dt = datetime.fromtimestamp(seconds_since_epoch)

如果time.gmtime(0)1970-01-01 00:00:00+00:00 time.gmtime(0) 1970-01-01 00:00:00+00:00 (POSIX纪元),则后者和time.mktime()可以正常工作(接受/返回POSIX时间戳)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM