我有以下简单的脚本(使用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不如时代?
谢谢!
卢卡斯
答案 0 :(得分:1)
你现在可能已经想到了这一点,但无论如何它仍然存在:
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')