我试着写一对函数, dt
和ut
,即(自1970-01-01 00:00:00 UTC秒)来回转换普通的UNIX时间之间和Python的日期时间对象。
如果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))
可惜的是,所述第二时间戳是3600秒(1小时)小于第一。 我认为,这只是发生了非常特殊的unixtimes,也许这是每小时夏令时跳过过程。 但是,有没有写一个方式dt
和ut
所以他们彼此的真实逆?
相关的问题: 制作matplotlib的date2num和num2date完善逆
你是正确的,这种行为是夏令时间有关。 避免这个问题的最简单的方法是,以确保您使用的时区没有夏令时,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())
这是一个有点落后原因的解释datetime.datetime.fromtimestamp()
与日光节约时间的问题,从文档:
返回对应于POSIX时间戳本地日期和时间,如由返回time.time()
如果可选参数TZ是无或不指定,时间戳转换为平台的本地日期和时间,返回的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)
文章来源: Convert a unixtime to a datetime object and back again (pair of time conversion functions that are inverses)