将unixtime转换为datetime对象然后再转换(转换为时间转换函数对)

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所以他们是彼此真正的逆转?

相关问题:使matplotlib的date2num和num2date完美反转

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)