【问题标题】:Python datetime to timestamp conversion and backPython日期时间到时间戳转换并返回
【发布时间】:2014-08-23 22:13:35
【问题描述】:

经过相当多的努力和阅读,我想出了以下两个函数,其中一个是(或打算成为)另一个的完全相反。第一个采用 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) 有没有办法让时间戳变成浮点数,而不是 calendar.timegm() 返回的整数秒数?

【问题讨论】:

  • 你看到this question了吗?
  • 不,我以前没见过这个问题。我没有在它的答案中看到任何能给我新见解的东西,但也许我还没有足够仔细地研究它。在第二个函数中,我使用了三个嵌套函数来消除时区问题(mktime 和 fromtimestamp 一样假定本地时间)。

标签: python datetime calendar timestamp


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2012-05-04
    • 2020-06-15
    • 2016-10-11
    • 2019-02-03
    • 2016-03-21
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多