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

时间:2013-02-12 23:25:43

标签: python datetime

我正在为我的项目创建一个新闻博客,我必须在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

2 个答案:

答案 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,则不会出现问题。)