我有一些代码用于将存储为字符串的一些时间戳转换为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对象的好方法是什么?
答案 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()