在Python中将时间戳转换为经过的分钟数

1 投票
2 回答
2094 浏览
提问于 2025-04-17 15:41

我正在做一个新闻博客项目,需要在新闻标题下显示时间,比如“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 个回答

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,这就不会是个问题。)

3

你的例子有几个问题(我看到你现在已经修复了):

  • 第一行应该是:

    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

撰写回答