有一个正确的日期时间和正确的时区

2024-04-25 11:57:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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)中,实际日期是May, 8th, 2015 18:57。在

在rssxml中,值是<pubDate>Fri, 08 May 2015 18:57:39 +0200</pubDate>

当我把它解析成datetime时,我得到2015, 5, 8, 17, 57, 39。在

如何使2015, 5, 8, 18, 57, 39不受恶意攻击,而只需配置正确的时区?在

编辑:

通过这样做:

^{pr2}$

我得到了一些更好的东西,但是,它在脚本的其余部分似乎不起作用,我得到了很多TypeError: can't compare offset-naive and offset-aware datetimes错误。在


Tags: 数据代码importhttpdatetimetimeparsemay
3条回答

试试这个:

>>> import os
>>> os.environ['TZ'] = 'Europe/Paris'
>>> time.tzset()
>>> time.tzname
('CET', 'CEST')

feedparser确实提供了原始的日期时间字符串(只需从属性名中删除_parsed后缀),因此,如果您知道字符串的格式,您可以自己将其解析为支持tz的datetime对象。在

例如,通过您的代码,您可以获得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

编辑:由于Python2.x不支持%z指令,请改用python-dateutil

^{pr2}$

那么

from dateutil import parser
datetime_rss = parser.parse(d.entries[0].published)

文档位于https://dateutil.readthedocs.org/en/latest/

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

RSS feeds may use many different dates formats;我将把日期解析留给feedparser模块。在

如果要将本地时间作为可感知的datetime对象:

^{pr2}$

相关问题 更多 >

    热门问题