首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python datetime.datetime从time.structtime差分

Python datetime.datetime从time.structtime差分
EN

Stack Overflow用户
提问于 2015-08-01 20:45:00
回答 2查看 849关注 0票数 0

我使用feed解析器从一些RSS提要中获取条目。这些条目有一个published_parsed字段,该字段由field解析器解析为time.structtime。

我使用这个函数将time.structtime转换为datetime.datetime:

代码语言:javascript
复制
def publishParsedToDatetime(structTime): 
    return datetime.datetime.fromtimestamp(time.mktime(structTime))

投入(结构时间):

代码语言:javascript
复制
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)

输出(日期时间):

代码语言:javascript
复制
2015-08-01 21:28:33

我看到了一个与时区相关的问题,在结构时间和日期时间值之间存在1小时差

结构时间值为UTC。但是datetime.datetime值既不是UTC,也不是我当前的时区(CET,中欧时间,我们观察夏季,所以我们现在有UTC +2小时)。

这怎么解释呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-01 21:05:27

实际上,正如在datetime.fromtimestamp中所解释的,默认情况下它会转换为本地时间:

返回与POSIX时间戳对应的本地日期和时间,如time.time()返回的时间。如果可选参数tz未指定或未指定,则时间戳将转换为平台的本地日期和时间,而返回的datetime对象是朴素的。

tm_isdst=0告诉它不要使用夏时制(尽管您的本地时区使用它)来解释1小时的差异。

为了更清楚地看到这一点,我们构造了两个测试用例。

代码语言:javascript
复制
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)))

这方面的产出如下:

代码语言:javascript
复制
Old conversion: 2015-08-01 21:28:33
New conversion: 2015-08-01 20:28:33

那么,您看到的问题是,传递给您的structTime对象有tm_isdst=0,但是您要解析的时间戳是针对DST时区的。

正如您在另一条注释中已经指出的,正确的解决方案可能是始终在后端代码中使用UTC,并且只在向用户显示时间或读取用户输入时进行时区处理。

票数 1
EN

Stack Overflow用户

发布于 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将返回相应的天真本地日期时间。

代码语言:javascript
复制
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))

收益率

代码语言:javascript
复制
Naive local: 2015-08-01 22:28:33
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31766070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档