具有正确的时区和正确的日期时间
Have a correct datetime with correct timezone
我正在使用 feedparser
来获取 RSS 数据。
这是我的代码:
>>> import datetime
>>> import time
>>> import feedparser
>>> d=feedparser.parse("http://.../rss.xml")
>>> datetimee_rss = d.entries[0].published_parsed
>>> datetimee_rss
time.struct_time(tm_year=2015, tm_mon=5, tm_mday=8, tm_hour=16, tm_min=57, tm_sec=39, tm_wday=4, tm_yday=128, tm_isdst=0)
>>> datetime.datetime.fromtimestamp(time.mktime(datetimee_rss))
datetime.datetime(2015, 5, 8, 17, 57, 39)
在我的时区(法国),实际日期是 May, 8th, 2015 18:57
。
RSS XML中的值为<pubDate>Fri, 08 May 2015 18:57:39 +0200</pubDate>
当我将它解析为日期时间时,我得到了 2015, 5, 8, 17, 57, 39
。
如何 2015, 5, 8, 18, 57, 39
没有肮脏的黑客,而只是通过配置正确的时区?
编辑:
通过做:
>>> from pytz import timezone
>>> datetime.datetime.fromtimestamp(time.mktime(datetimee_rss),tz=timezone('Euro
pe/Paris'))
datetime.datetime(2015, 5, 8, 17, 57, 39, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)
我得到了更好的东西,但是,它似乎在脚本的其余部分不起作用,我遇到了很多 TypeError: can't compare offset-naive and offset-aware datetimes
错误。
试试这个:
>>> import os
>>> os.environ['TZ'] = 'Europe/Paris'
>>> time.tzset()
>>> time.tzname
('CET', 'CEST')
feedparser
确实提供了原始的日期时间字符串(只是去掉属性名的_parsed
后缀),所以如果你知道字符串的格式,你可以把它解析成一个tz-自己知道日期时间对象。
例如,使用您的代码,您可以获得 tz 感知对象:
datetime.datetime.strptime(d.entries[0].published, '%a, %d %b %Y %H:%M:%S %z')
有关 strptime()
的更多参考,请参阅 https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
编辑:由于 Python 2.x 不支持 %z
指令,请改用 python-dateutil
pip install python-dateutil
然后
from dateutil import parser
datetime_rss = parser.parse(d.entries[0].published)
feedparser
returns UTC 时区时间。将 time.mktime()
应用于它是不正确的(除非您当地的时区是 UTC 而不是)。您应该使用 calendar.timegm()
代替:
import calendar
from datetime import datetime
utc_tuple = d.entries[0].published_parsed
posix_timestamp = calendar.timegm(utc_tuple)
local_time_as_naive_datetime_object = datetime.frometimestamp(posix_timestamp) # assume non-"right" timezone
RSS feeds may use many different dates formats;我会将日期解析留给 feedparser
模块。
如果您想获取本地时间作为感知日期时间对象:
from tzlocal import get_localzone # $ pip install tzlocal
local_timezone = get_localzone()
local_time = datetime.frometimestamp(posix_timestamp, local_timezone) # assume non-"right" timezone
我正在使用 feedparser
来获取 RSS 数据。
这是我的代码:
>>> import datetime
>>> import time
>>> import feedparser
>>> d=feedparser.parse("http://.../rss.xml")
>>> datetimee_rss = d.entries[0].published_parsed
>>> datetimee_rss
time.struct_time(tm_year=2015, tm_mon=5, tm_mday=8, tm_hour=16, tm_min=57, tm_sec=39, tm_wday=4, tm_yday=128, tm_isdst=0)
>>> datetime.datetime.fromtimestamp(time.mktime(datetimee_rss))
datetime.datetime(2015, 5, 8, 17, 57, 39)
在我的时区(法国),实际日期是 May, 8th, 2015 18:57
。
RSS XML中的值为<pubDate>Fri, 08 May 2015 18:57:39 +0200</pubDate>
当我将它解析为日期时间时,我得到了 2015, 5, 8, 17, 57, 39
。
如何 2015, 5, 8, 18, 57, 39
没有肮脏的黑客,而只是通过配置正确的时区?
编辑:
通过做:
>>> from pytz import timezone
>>> datetime.datetime.fromtimestamp(time.mktime(datetimee_rss),tz=timezone('Euro
pe/Paris'))
datetime.datetime(2015, 5, 8, 17, 57, 39, tzinfo=<DstTzInfo 'Europe/Paris' CEST+2:00:00 DST>)
我得到了更好的东西,但是,它似乎在脚本的其余部分不起作用,我遇到了很多 TypeError: can't compare offset-naive and offset-aware datetimes
错误。
试试这个:
>>> import os
>>> os.environ['TZ'] = 'Europe/Paris'
>>> time.tzset()
>>> time.tzname
('CET', 'CEST')
feedparser
确实提供了原始的日期时间字符串(只是去掉属性名的_parsed
后缀),所以如果你知道字符串的格式,你可以把它解析成一个tz-自己知道日期时间对象。
例如,使用您的代码,您可以获得 tz 感知对象:
datetime.datetime.strptime(d.entries[0].published, '%a, %d %b %Y %H:%M:%S %z')
有关 strptime()
的更多参考,请参阅 https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
编辑:由于 Python 2.x 不支持 %z
指令,请改用 python-dateutil
pip install python-dateutil
然后
from dateutil import parser
datetime_rss = parser.parse(d.entries[0].published)
feedparser
returns UTC 时区时间。将 time.mktime()
应用于它是不正确的(除非您当地的时区是 UTC 而不是)。您应该使用 calendar.timegm()
代替:
import calendar
from datetime import datetime
utc_tuple = d.entries[0].published_parsed
posix_timestamp = calendar.timegm(utc_tuple)
local_time_as_naive_datetime_object = datetime.frometimestamp(posix_timestamp) # assume non-"right" timezone
RSS feeds may use many different dates formats;我会将日期解析留给 feedparser
模块。
如果您想获取本地时间作为感知日期时间对象:
from tzlocal import get_localzone # $ pip install tzlocal
local_timezone = get_localzone()
local_time = datetime.frometimestamp(posix_timestamp, local_timezone) # assume non-"right" timezone