我正在为我的项目创建一个新闻博客,我必须在x分钟前以新闻标题显示时间等。
从新闻的RSS提要中,我有一个字符串形式的时间戳。例如:
timestamp ='星期二,2013年2月12日07:43:09 GMT'
我试图在python中使用datetime模块找到此时间戳和当前时间之间的差异。但由于某种原因,它给出了错误:
ValueError:astimezone()无法应用于天真的日期时间
如果有人能指出我正确的方向,我将不胜感激。以下是我在Python中的尝试:
from datetime import datetime
from pytz import timezone
timestamp = 'Tue, 12 Feb 2013 07:43:09 GMT'
t = datetime.strptime(timestamp, '%a, %d %b %Y %I:%M:%S %Z')
now_time = datetime.now(timezone('US/Pacific'))
# converting the timestamp to Pacific time
t_pacific = t.astimezone(timezone('US/Pacific')) # get error here
diff = t_pacific - t
谢谢! Prakhar
答案 0 :(得分:3)
你的例子有一些问题(我看到你现在修复了它们):
第一行应该是:
from datetime import datetime
看起来你错过了第4行的右括号:
now_time = datetime.now(timezone('US/Pacific')
什么是timezone()
?它来自哪里?
你真的不需要乱用时区,我不认为 - 只需使用GMT(UTC)。更像是这样的事情:
from datetime import datetime
timestamp = 'Tue, 12 Feb 2013 07:43:09 GMT'
t = datetime.strptime(timestamp, '%a, %d %b %Y %I:%M:%S %Z')
t_now = datetime.utcnow()
diff = t_now - t
答案 1 :(得分:2)
这里的问题是t
没有时区 - 这就是“天真的日期时间”错误信息的含义。来自the docs:
有两种日期和时间对象:“天真”和“意识到”......一个有意识的对象对...时区和夏令时信息有足够的了解...一个天真的对象没有......
你可以通过这样做验证它是天真的:
print(t.tzinfo)
答案是None
。
正如astimezone
docs所说:
self
必须注意(self.tzinfo
不得为None
,且self.utcoffset()
不得返回None
。)
strptime
函数始终会生成一个天真的日期时间。
您可以通过各种方式解决此问题:
t
转换为GMT日期时间而不是天真时间,然后转换为'US/Pacific'
即可。正如文档所说,“如果您只想在不调整日期和时间数据的情况下将时区对象tz附加到日期时间dt,请使用dt.replace(tzinfo=tz)
。”既然您知道时间是UTC,只需replace
使用UTC的空tz,您就知道了时间。
astimezone
不同的机制转换为PST,在此机制上将采用UTC或允许您指定源。{/ li>
有各种替代方案,但您已使用pytz
,请参阅its documentation。
now_time
转换为UTC,而不是将t
转换为PST。对于大多数用例来说,最后一个可能是最简单和最好的。由于您在PST中明确要求提供now_time
,因此您所要做的就是不要这样做(或明确要求'GMT'
而不是'US/Pacific'
)。然后你可以按UTC时间进行日期算术。
如果您需要在PST中显示最终结果,那么在UTC中进行算术通常更好,并在最后进行转换。 (例如,您可以有两次相隔一小时,但在太平洋地区具有相同的值,因为DST日凌晨1点重复两次;如果您始终保持UTC,则不会出现问题。)