我遇到了一个错误的错误。我正在使用django,我将datetime
值保存为数据库中的纪元时间,但是当我想在python中转换它们时,我遇到了错误。
如果我使用此代码
datetime.datetime.utcfromtimestamp(-14471).strftime('%Y-%m-%d')
'1969-12-31'
它工作正常,但如果我使用
datetime.datetime.utcfromtimestamp(-144714).strftime('%Y-%m-%d')
Traceback (most recent call last):
File "<input>", line 1, in <module>
OSError: [Errno 22] Invalid argument
它不起作用。以及我无法转换我的数据库值,但为什么会发生此错误。我有什么其他选择来处理这个问题以及为什么会出现这种行为?
我正在使用python 3.6.4
我也试过这个,它给了我同样的错误
utc_time = datetime.fromtimestamp(-698577777, timezone.utc)
Traceback (most recent call last):
File "<input>", line 1, in <module>
OSError: [Errno 22] Invalid argument
utc_time = datetime.fromtimestamp(12525, timezone.utc)
works..
这是另一个测试
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> utc_time = datetime.datetime.fromtimestamp(-698577777, datetime.timezone.utc)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
>>> datetime.datetime(1947, 11, 12, 14, 37, 3, tzinfo=datetime.timezone.utc)
datetime.datetime(1947, 11, 12, 14, 37, 3, tzinfo=datetime.timezone.utc)
>>> datetime.MINYEAR
1
>>> datetime.MAXYEAR
9999
>>>
答案 0 :(得分:2)
来自the docs:
如果时间戳超出平台C gmtime()函数支持的值范围,并且gmtime()失败时出现OSError,则可能引发OverflowError。这种情况通常限于1970年至2038年。
文档还告诉您如何解决此问题:
要获取有意识的日期时间对象,请调用fromtimestamp():
datetime.fromtimestamp(timestamp, timezone.utc)
在POSIX兼容平台上,它等同于以下表达式:
datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)
除了后一个公式始终支持全年范围:
MINYEAR
和MAXYEAR
之间的包含。
在问题中重新考虑您的补充。在ubuntu linux 16.04 LTS上你的代码在python 3.5.2 shell中运行良好:
>>> import datetime
>>> utc_time = datetime.datetime.fromtimestamp(-698577777, datetime.timezone.utc)
>>> utc_time
datetime.datetime(1947, 11, 12, 14, 37, 3, tzinfo=datetime.timezone.utc)
>>> datetime.MINYEAR
1
>>> datetime.MAXYEAR
9999