5

我有一些代码用于将存储为字符串的一些时间戳转换为日期时间对象,并注意到今天在转换具有大于最大 int 的 int 时间戳值的日期时出现异常。

datetime.datetime.fromtimestamp(2147570047)

例如给我

ValueError: timestamp out of range for platform time_t

我怎样才能解决这个问题?假设我想继续使用 32 位 python(运行 2.7.2)

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

4

2 回答 2

8

想我解决了,我有点惊讶这不会引发同样的异常

>>> 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)
于 2012-05-14T17:23:01.023 回答
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()

于 2018-05-10T03:16:57.877 回答