python utcfromtimestamp for -144714返回错误

时间:2018-02-18 14:11:29

标签: django python-3.6

我遇到了一个错误的错误。我正在使用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
>>>

1 个答案:

答案 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)

  

除了后一个公式始终支持全年范围:MINYEARMAXYEAR之间的包含。

在问题中重新考虑您的补充。在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