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