在Python中将时间戳转换为经过的分钟数
我正在做一个新闻博客项目,需要在新闻标题下显示时间,比如“x分钟前”等等。
我从新闻的RSS源中得到了一个时间戳,它是一个字符串,格式如下:
timestamp = 'Tue, 12 Feb 2013 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
2 个回答
这里的问题是,t
没有时区信息,这就是错误信息中提到的“天真的日期时间”的意思。根据文档:
日期和时间对象有两种类型:“天真”和“有意识”……有意识的对象对……时区和夏令时信息有足够的了解……而天真的对象则没有……
你可以通过以下方式确认它是天真的:
print(t.tzinfo)
结果会是None
。
正如astimezone
文档所说:
self
必须是有意识的(self.tzinfo
不能是None
,并且self.utcoffset()
不能返回None
)。
strptime
函数总是生成一个天真的日期时间。
你可以通过多种方式来解决这个问题:
- 首先把
t
转换为GMT日期时间,而不是天真的日期时间,这样你转换为'US/Pacific'
就能成功了。
正如文档所说,“如果你只是想把一个时区对象tz
附加到一个日期时间dt
上,而不调整日期和时间数据,可以使用dt.replace(tzinfo=tz)
。”因为你知道时间是UTC的,所以只需用UTC替换掉空的时区信息,这样你就得到了一个有意识的时间。
- 用不同于
astimezone
的机制将其转换为PST,这种机制会假设是UTC,或者允许你指定来源。
还有很多其他的选择,但你已经在使用pytz
,所以可以查看它的文档。
- 将
now_time
转换为UTC,而不是将t
转换为PST。
最后一个方法可能是最简单的,适合大多数情况。因为你之所以得到now_time
是PST,是因为你明确要求这样,所以你只需不这样做(或者明确要求'GMT'
而不是'US/Pacific'
)。这样你就可以在UTC时间上进行日期计算。
如果你需要在PST中显示最终结果,通常在UTC中进行计算,然后最后转换会更好。(例如,你可能有两个时间相差一小时,但在太平洋时间中值是相同的,因为夏令时那天的1点钟会重复两次;如果你一直保持在UTC,这就不会是个问题。)
你的例子有几个问题(我看到你现在已经修复了):
第一行应该是:
from datetime import datetime
看起来你在第四行缺少一个右括号:
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