dre*_*ves 26 python time datetime date dst
我正在尝试编写一对函数,dt并且ut在正常的unix时间(自1970-01-01 00:00:00 UTC以来的秒数)和Python datetime对象之间来回转换.
如果dt并且ut是正确的反转,则此代码将打印两次相同的时间戳:
import time, datetime
# Convert a unix time u to a datetime object d, and vice versa
def dt(u): return datetime.datetime.fromtimestamp(u)
def ut(d): return time.mktime(d.timetuple())
u = 1004260000
print u, "-->", ut(dt(u))
Run Code Online (Sandbox Code Playgroud)
唉,第二个时间戳比第一个时间戳少3600秒(一小时).我认为这只发生在非常特殊的unixtimes上,也许在那个时间里,夏令时会跳过.但有没有办法写作dt,ut所以他们是彼此真正的逆转?
And*_*ark 39
你是对的,这种行为与夏令时有关.避免这种情况的最简单方法是确保使用没有夏令时的时区,UTC在这里最有意义.
datetime.datetime.utcfromtimestamp()并calendar.timegm()处理UTC时间,并且是完全相反的.
import calendar, datetime
# Convert a unix time u to a datetime object d, and vice versa
def dt(u): return datetime.datetime.utcfromtimestamp(u)
def ut(d): return calendar.timegm(d.timetuple())
Run Code Online (Sandbox Code Playgroud)
这里有一些解释,为什么datetime.datetime.fromtimestamp()有一个夏令时问题,来自文档:
返回与POSIX时间戳对应的本地日期和时间,例如返回的
time.time().如果可选参数tz为None或未指定,则时间戳将转换为平台的本地日期和时间,并且返回的datetime对象是天真的.
这里的重要部分是你得到一个天真的datetime.datetime对象,这意味着没有时区(或夏令时)信息作为对象的一部分.这意味着多个不同的时间戳可以datetime.datetime在使用时映射到同一个对象fromtimestamp(),如果您碰巧在夏令时回滚期间选择了下降时间:
>>> datetime.datetime.fromtimestamp(1004260000)
datetime.datetime(2001, 10, 28, 1, 6, 40)
>>> datetime.datetime.fromtimestamp(1004256400)
datetime.datetime(2001, 10, 28, 1, 6, 40)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30253 次 |
| 最近记录: |