我使用feed解析器从一些RSS提要中获取条目。这些条目有一个published_parsed字段,该字段由field解析器解析为time.structtime。
我使用这个函数将time.structtime转换为datetime.datetime:
def publishParsedToDatetime(structTime):
return datetime.datetime.fromtimestamp(time.mktime(structTime))投入(结构时间):
time.struct_time(tm_year=2015, tm_mon=8, tm_mday=1, tm_hour=20, tm_min=28, tm_sec=33, tm_wday=5, tm_yday=213, tm_isdst=0)输出(日期时间):
2015-08-01 21:28:33我看到了一个与时区相关的问题,在结构时间和日期时间值之间存在1小时差。
结构时间值为UTC。但是datetime.datetime值既不是UTC,也不是我当前的时区(CET,中欧时间,我们观察夏季,所以我们现在有UTC +2小时)。
这怎么解释呢?
发布于 2015-08-01 21:05:27
实际上,正如在datetime.fromtimestamp中所解释的,默认情况下它会转换为本地时间:
返回与POSIX时间戳对应的本地日期和时间,如time.time()返回的时间。如果可选参数tz未指定或未指定,则时间戳将转换为平台的本地日期和时间,而返回的datetime对象是朴素的。
tm_isdst=0告诉它不要使用夏时制(尽管您的本地时区使用它)来解释1小时的差异。
为了更清楚地看到这一点,我们构造了两个测试用例。
import time, datetime
# this is how your time object was constructed before
tm_isdst = 0
t = time.mktime((2015, 8, 1, 20, 28, 33, 5, 213, tm_isdst))
print("Old conversion: {0}".format(datetime.datetime.fromtimestamp(t)))
# this is what happens if you let mktime "divine" a time zone
tm_isdst = -1
t = time.mktime((2015, 8, 1, 20, 28, 33, 5, 213, tm_isdst))
print("New conversion: {0}".format(datetime.datetime.fromtimestamp(t)))这方面的产出如下:
Old conversion: 2015-08-01 21:28:33
New conversion: 2015-08-01 20:28:33那么,您看到的问题是,传递给您的structTime对象有tm_isdst=0,但是您要解析的时间戳是针对DST时区的。
正如您在另一条注释中已经指出的,正确的解决方案可能是始终在后端代码中使用UTC,并且只在向用户显示时间或读取用户输入时进行时区处理。
发布于 2015-08-02 00:45:37
calendar.timegm以UTC时间元组作为输入,并返回它的时间戳。相反,time.mktime以本地时间元组作为输入,并返回其(UTC)时间戳。所有的时间戳都代表自世界协调世界时1970年-1-1:00:00以来的秒数.
utcfromtimestamp将时间戳作为输入,并将其转换为天真(即时区不知情)的UTC日期时间。fromtimestamp使用相同的时间戳并将其转换为相应的天真本地日期时间。
由于您的时间元组(例如structTime)是UTC时间组,您应该使用calendar.timegm而不是time.mktime来找到正确的时间戳。一旦您有了正确的时间戳,fromtimestamp将返回相应的天真本地日期时间。
import time
import calendar
import datetime as DT
timetuple = (2015, 8, 1, 20, 28, 33, 5, 213, 0)
timestamp = calendar.timegm(timetuple)
naive_local_date = DT.datetime.fromtimestamp(timestamp)
print('Naive local: {}'.format(naive_local_date))收益率
Naive local: 2015-08-01 22:28:33https://stackoverflow.com/questions/31766070
复制相似问题