datetime.strptime 和从 dateutil 解析之间的区别?
Difference between datetime.strptime and parse from dateutil?
当我解析以下时间字符串时,我在几秒钟内得到了两个不同的结果:
方法一:
from datetime import datetime
int(datetime.strptime('2015-03-25T19:46:23.286966Z', '%Y-%m-%dT%H:%M:%S.%fZ').timestamp())
产量1427309183
方法二:
from dateutil.parser import parse
int(parse('2015-03-25T19:46:23.286966Z').timestamp())
产量1427312783
似乎方法 1 忽略了 TZ vs 方法 do(我 运行 它来自 UTC+1 tz)。
问题:为什么这两种方法会产生不同的秒时间戳?有人可以解释一下幕后发生的事情以及如何最好地处理这种情况。
我的目标是将字符串转换为 unix 纪元时间(即 utc)中的秒数。
如果您查看中间结果(日期时间对象)的 repr
,您会发现一个不同之处:
from datetime import datetime
from dateutil.parser import parse
print(repr(datetime.strptime('2015-03-25T19:46:23.286966Z', '%Y-%m-%dT%H:%M:%S.%fZ')))
# datetime.datetime(2015, 3, 25, 19, 46, 23, 286966)
print(repr(parse('2015-03-25T19:46:23.286966Z')))
# datetime.datetime(2015, 3, 25, 19, 46, 23, 286966, tzinfo=tzutc())
第一个是幼稚的,没有设置 tzinfo,因为您在解析指令中使用了文字 Z
。第二个是有意识的; tzinfo 设置为 UTC,因为 dateutil 的解析器识别 Z
来表示 UTC。这造成了时间戳的差异,因为 Python 将原始日期时间视为 当地时间 - 因此相差 1 小时,这是您当地时间的 UTC 偏移量。
你可以正确解析like
print(repr(datetime.fromisoformat('2015-03-25T19:46:23.286966Z'.replace('Z', '+00:00'))))
# datetime.datetime(2015, 3, 25, 19, 46, 23, 286966, tzinfo=datetime.timezone.utc)
另见 here。
或不太方便(恕我直言),strptime
:
print(repr(datetime.strptime('2015-03-25T19:46:23.286966Z', '%Y-%m-%dT%H:%M:%S.%f%z')))
# datetime.datetime(2015, 3, 25, 19, 46, 23, 286966, tzinfo=datetime.timezone.utc)
当我解析以下时间字符串时,我在几秒钟内得到了两个不同的结果:
方法一:
from datetime import datetime
int(datetime.strptime('2015-03-25T19:46:23.286966Z', '%Y-%m-%dT%H:%M:%S.%fZ').timestamp())
产量1427309183
方法二:
from dateutil.parser import parse
int(parse('2015-03-25T19:46:23.286966Z').timestamp())
产量1427312783
似乎方法 1 忽略了 TZ vs 方法 do(我 运行 它来自 UTC+1 tz)。
问题:为什么这两种方法会产生不同的秒时间戳?有人可以解释一下幕后发生的事情以及如何最好地处理这种情况。
我的目标是将字符串转换为 unix 纪元时间(即 utc)中的秒数。
如果您查看中间结果(日期时间对象)的 repr
,您会发现一个不同之处:
from datetime import datetime
from dateutil.parser import parse
print(repr(datetime.strptime('2015-03-25T19:46:23.286966Z', '%Y-%m-%dT%H:%M:%S.%fZ')))
# datetime.datetime(2015, 3, 25, 19, 46, 23, 286966)
print(repr(parse('2015-03-25T19:46:23.286966Z')))
# datetime.datetime(2015, 3, 25, 19, 46, 23, 286966, tzinfo=tzutc())
第一个是幼稚的,没有设置 tzinfo,因为您在解析指令中使用了文字 Z
。第二个是有意识的; tzinfo 设置为 UTC,因为 dateutil 的解析器识别 Z
来表示 UTC。这造成了时间戳的差异,因为 Python 将原始日期时间视为 当地时间 - 因此相差 1 小时,这是您当地时间的 UTC 偏移量。
你可以正确解析like
print(repr(datetime.fromisoformat('2015-03-25T19:46:23.286966Z'.replace('Z', '+00:00'))))
# datetime.datetime(2015, 3, 25, 19, 46, 23, 286966, tzinfo=datetime.timezone.utc)
另见 here。
或不太方便(恕我直言),strptime
:
print(repr(datetime.strptime('2015-03-25T19:46:23.286966Z', '%Y-%m-%dT%H:%M:%S.%f%z')))
# datetime.datetime(2015, 3, 25, 19, 46, 23, 286966, tzinfo=datetime.timezone.utc)