1

我正在为我的项目制作一个新闻博客,其中我必须在新闻标题下显示 x 分钟前的时间等。

从新闻的 RSS 提要中,我有字符串形式的时间戳。例如:

时间戳 = '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

谢谢!普拉哈尔

4

2 回答 2

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
于 2013-02-12T23:40:25.493 回答
2

这里的问题是t没有时区——这就是错误消息中“naive datetime”的含义。从文档

有两种日期和时间对象:“naive”和“aware”……有意识的对象对……时区和夏令时信息有足够的了解……naive 对象没有……</p>

您可以通过执行以下操作来验证它是否幼稚:

print(t.tzinfo)

答案将是None

正如astimezone文档所说:

self必须知道(self.tzinfo不得Noneself.utcoffset()不得返回None)。

strptime函数总是生成一个简单的日期时间。

您可以通过多种方式解决此问题:

  • 首先转换t为 GMT 日期时间而不是简单的日期时间,然后您的转换'US/Pacific'将起作用。

正如文档所说,“如果您只想将时区对象 tz 附加到日期时间 dt 而不调整日期和时间数据,请使用dt.replace(tzinfo=tz).” 既然您知道时间是 UTC,那么只有replace带有 UTC 的空 tz,您就知道时间了。

  • 使用与 不同的机制转换为 PST astimezone,在该机制上将假定 UTC 或允许您指定源。

那里有各种替代方案,但您已经在使用pytz,因此请参阅其文档

  • 转换now_time为 UTC 而不是转换t为 PST。

对于大多数用例来说,最后一个可能是最简单和最好的。由于您只是now_time因为您以这种方式明确要求而获得了 PST,因此您所要做的就是不这样做(或明确要求'GMT'而不是'US/Pacific')。然后你可以在 UTC 时间上做你的日期算术。

如果您需要在 PST 中显示最终结果,通常最好在 UTC 中进行算术,并在最后进行转换。(例如,您可以有两次相隔一小时的时间,但在太平洋地区具有相同的值,因为 DST 当天的凌晨 1 点会重复两次;如果您一直停留在 UTC,那将不是问题。)

于 2013-02-12T23:53:46.443 回答