Python 有一个正确的日期时间和正确的时区
我正在使用Python 有一个正确的日期时间和正确的时区,python,datetime,rss,feedparser,Python,Datetime,Rss,Feedparser,我正在使用feedparser来获取RSS数据。 这是我的密码: >>> import datetime >>> import time >>> import feedparser >>> d=feedparser.parse("http://.../rss.xml") >>> datetimee_rss = d.entries[0].published_parsed >>> dat
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)
在我的时区(FR),实际日期是2015年5月8日18:57
在RSS XML中,值为Fri,2015年5月8日18:57:39+0200
当我把它解析成datetime时,我得到了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>)
来自pytz导入时区的>>
>>>datetime.datetime.fromtimestamp(time.mktime(datetimee_rss),tz=时区('Euro
(巴黎)
datetime.datetime(2015,5,8,17,57,39,tzinfo=)
我得到了一些更好的东西,但是,它似乎在脚本的其余部分不起作用,我得到了大量的类型错误:无法比较偏移量原始和偏移量感知日期时间
错误。尝试以下方法:
>>> import os
>>> os.environ['TZ'] = 'Europe/Paris'
>>> time.tzset()
>>> time.tzname
('CET', 'CEST')
feedparser
确实提供了原始的日期时间字符串(只需从属性名中删除\u parsed
后缀),因此如果您知道字符串的格式,您可以自己将其解析为一个tz感知的日期时间对象
例如,使用代码,您可以获得tz感知对象,如下所示:
datetime.datetime.strptime(d.entries[0].published, '%a, %d %b %Y %H:%M:%S %z')
有关strtime()
的更多参考信息,请参阅
编辑:由于Python2.x不支持%z
指令,请改用PythonDateUtil
pip install python-dateutil
然后
feedparser上的文档以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
);我将把日期解析留给feedparser
模块
如果要将本地时间作为aware datetime对象获取,请执行以下操作:
from tzlocal import get_localzone # $ pip install tzlocal
local_timezone = get_localzone()
local_time = datetime.frometimestamp(posix_timestamp, local_timezone) # assume non-"right" timezone
我不知道提要解析器是如何处理这些日期的,但是生成的datetimes和time元组实际上根本不支持tz。除了Python问题之外,您应该注意RSS提要中的时间戳通常非常混乱,默认情况下您可能不应该“信任”它们。有几家服务公司利用其“发现”日期对新闻进行欺骗。@juliengestoux我已经想到了这一点。如果我在生活环境中遇到太多的麻烦,我会试试看:-)谢谢!我收到以下错误:
ValueError:“z”是错误的指令,格式为“%a,%d%b%Y%H:%M:%S%z”
如果您使用的是Python 2.x,它不支持%z
。请检查上面更新的答案。它在控制台中工作,但给定的日期时间格式在使用其他日期时间(如“datatime.now()”:TypeError:无法比较初始偏移量和感知偏移量的日期时间(与我编辑的问题相同)。是否可以将“offset-aware”转换为“offset-naive”@Blusky您无法将tz-aware日期时间对象与naive对象进行比较,因为后者没有任何时区信息。您知道原始datetime对象的时区是什么吗?本地tz是“Europe/Paris”,datetime由datetime.datetime.now()提供。现在没有tz不是很奇怪吗?我得到了以下错误:AttributeError:'module'对象没有属性“tzset”
。显然,tzset仅适用于Linux。我在Windows上运行,希望脚本是多平台的。还有别的想法吗?
from tzlocal import get_localzone # $ pip install tzlocal
local_timezone = get_localzone()
local_time = datetime.frometimestamp(posix_timestamp, local_timezone) # assume non-"right" timezone