如何解决Python datetime 夏令时问题?
我想知道为什么增量是 3601 秒,而它应该是 1 秒:
from datetime import datetime
from dateutil import tz
# Create eastern timezone
eastern = tz.gettz('America/New_York')
# 2017-03-12 01:59:59 in Eastern Time (EST)
spring_ahead_159am = datetime(2017,3,12,1,59,tzinfo = eastern)
# 2017-03-12 03:00:00 in Eastern Time (EDT)
spring_ahead_3am = datetime(2017,tzinfo = eastern)
(spring_ahead_3am - spring_ahead_159am).seconds
3601
请解释我做错了什么?为什么它没有给我 1 秒的差异?
附:
请解释为什么这样做很容易: 让:
EST = timezone(timedelta(hours=-5))
EDT = timezone(timedelta(hours=-4))
spring_ahead_159am = datetime(2017,tzinfo = EST)
spring_ahead_3am = datetime(2017,tzinfo = EDT)
(spring_ahead_3am - spring_ahead_159am).seconds
1
解决方法
这是 datetime 对象的一个小怪癖。引用文档:
-
仅当两个操作数都是幼稚的,或者两者都知道时,才定义从日期时间减去日期时间。如果一个人知道而另一个人天真,则会引发 TypeError。
如果两者都是幼稚的,或者两者都知道并且具有相同的 tzinfo 属性,则 tzinfo 属性将被忽略,结果是一个 timedelta 对象 t,使得 datetime2 + t == datetime1。在这种情况下不进行时区调整。
你肯定可以通过减去他们的 DST 分量来得到你想要的:
>>> spring_ahead_3am - spring_ahead_3am.dst() - spring_ahead_159am + spring_ahead_159am.dst()
datetime.timedelta(seconds=1)
更新
考虑使用这个函数,它可以跨时区和 DST 更改做正确的事情:
def datesub( dt1,dt2 ):
return datetime.timedelta( seconds=dt2.timestamp()-dt1.timestamp() )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。