将大于maxint的时间戳转换为datetime对象

时间:2012-05-14 17:14:57

标签: python datetime year2038

我有一些代码用于将存储为字符串的一些时间戳转换为datetime对象,并且当它转换日期时int时间戳值大于max int时会注意到异常。

datetime.datetime.fromtimestamp(2147570047)

例如给我

ValueError: timestamp out of range for platform time_t

如何解决这个问题?假设我想继续使用32位python(运行2.7.2)

我注意到我可以将max int转换为datetime对象,然后使用timedeltas添加任何额外的东西,但我想不出在实践中这样做的特别有效或好的方法。我可以将这些2038多个时间戳转换为datetime对象的好方法是什么?

2 个答案:

答案 0 :(得分:7)

想想我已经解决了,我有点意外,这不会引发同样的异常

>>> datetime.datetime.fromtimestamp(0) + datetime.timedelta(seconds=2147570047)
datetime.datetime(2038, 1, 20, 4, 14, 7)
编辑:这不是一个完美的解决方案,似乎是时区的一些问题(我目前正处于BST时间(+1),所以可能会解释为什么以下相隔一小时)

>>> datetime.datetime.fromtimestamp(2047570047)
datetime.datetime(2034, 11, 19, 17, 27, 27)
>>> datetime.datetime.fromtimestamp(0) + datetime.timedelta(seconds=2047570047)
datetime.datetime(2034, 11, 19, 18, 27, 27)

答案 1 :(得分:0)

试试这个



__author__ = 'allenlin'
import math
import datetime
import calendar


def datetime2timestamp(dt):
    ts = calendar.timegm(dt.timetuple())
    return ts


def timestamp2datetime(timestamp):
    day_sec = 60*60*24
    ts_days = int(math.floor(timestamp / day_sec))
    ts_mod_sec = int(timestamp - (ts_days * day_sec))
    hour_sec = 60*60
    ts_mod_hour = int(math.floor(ts_mod_sec / hour_sec))
    ts_mod_sec = int(ts_mod_sec - (ts_mod_hour * hour_sec))
    min_sec = 60
    ts_mod_minute = int(math.floor(ts_mod_sec / min_sec))
    ts_mod_sec = int(ts_mod_sec - (ts_mod_minute * min_sec))

    revert = datetime.datetime(1970, 1, 1) + \
             datetime.timedelta(
                 days=ts_days,
                 hours=ts_mod_hour,
                 minutes=ts_mod_minute,
                 seconds=ts_mod_sec
             )
    return revert


def main():
    pass
    d_max = datetime.datetime.max
    print(d_max)
    ts_max = datetime2timestamp(d_max)
    print(ts_max)
    print (timestamp2datetime(ts_max))

    d_now = datetime.datetime.now()
    print(d_now)
    ts_now = datetime2timestamp(d_now)
    print(ts_now)
    print (timestamp2datetime(ts_now))


if __name__ == '__main__':
    main()