从Python中的纪元时间戳转换出来的混乱

时间:2017-05-26 02:51:36

标签: parsing datetime python-3.4 epoch

我有以下简单的脚本(使用Python 3.4)。

from dateutil.parser import *
import datetime
d1 = "1490917274299"
d2 = "1490917274"

1)执行datetime.datetime.fromtimestamp(int(d1)).strftime('%c')时,会出现以下错误:

>>> datetime.datetime.fromtimestamp(int(d1)).strftime('%c')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: timestamp out of range for platform time_t

2)我读过,避免毫秒解决了这个问题。所以我将d1/1000分为d2和il!

>>> datetime.datetime.fromtimestamp(int(d2)).strftime('%c')
'Thu Mar 30 23:41:14 2017'

3)但是,如果我想使用parse(d2),我会收到错误。

>>> parse(d2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/dist-packages/dateutil/parser.py", line 1168, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/dateutil/parser.py", line 578, in parse
    if cday > monthrange(cyear, cmonth)[1]:
  File "/usr/lib/python3.4/calendar.py", line 121, in monthrange
    day1 = weekday(year, month, 1)
  File "/usr/lib/python3.4/calendar.py", line 113, in weekday
    return datetime.date(year, month, day).weekday()
ValueError: year is out of range

4)如果您尝试parse(d1),您也会收到错误:

>>> parse(d1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.4/dist-packages/dateutil/parser.py", line 1168, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/dateutil/parser.py", line 578, in parse
    if cday > monthrange(cyear, cmonth)[1]:
  File "/usr/lib/python3.4/calendar.py", line 121, in monthrange
    day1 = weekday(year, month, 1)
  File "/usr/lib/python3.4/calendar.py", line 113, in weekday
    return datetime.date(year, month, day).weekday()
OverflowError: Python int too large to convert to C long

5)最后,如果您在https://www.epochconverter.com/中使用d1,则可以正确获得预期日期。

为什么会发生这种情况?我只是想通过使用parse()检查一个字符串是否是一个日期时间的方法,但是不能正常工作,因为epoch字符串很好(至少是d2)。

另一方面,为什么d1不如时代?

谢谢!

卢卡斯

1 个答案:

答案 0 :(得分:1)

你现在可能已经想到了这一点,但无论如何它仍然存在:

dateutil.parser&#39; parse函数无法解析Unix时间 - See this somewhat related issue

所以回答3&amp; 4。

现在开始1&amp;你不能解析d1的原因是因为它不是Unix时间。 Unix时间定义为自1970年1月1日星期四00:00:00协调世界时(UTC)以来经过的秒数减去自那时以来发生的闰秒数(谢谢维基百科!)。如果要包含指定的毫秒数,请在小数点后添加它们,如下所示:

d1 = "1490917274.299"

解析时请务必使用float而不是int

datetime.datetime.fromtimestamp(float(d1)).strftime('%c')