-->

再次转换unixtime为datetime对象和背面(对是逆时间转换功能)(Convert a un

2019-07-03 14:54发布

我试着写一对函数, dtut ,即(自1970-01-01 00:00:00 UTC秒)来回转换普通的UNIX时间之间和Python的日期时间对象。

如果dtut是正确的逆那么这段代码将打印相同的时间戳两次:

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,也许这是每小时夏令时跳过过程。 但是,有没有写一个方式dtut所以他们彼此的真实逆?

相关的问题: 制作matplotlib的date2num和num2date完善逆

Answer 1:

你是正确的,这种行为是夏令时间有关。 避免这个问题的最简单的方法是,以确保您使用的时区没有夏令时,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)