2013-02-12 156 views
1

我想提出一个新闻博客为我的项目经过分钟,我有把这个消息标题为x分钟前等转换时间戳在Python

从新闻的RSS源来显示时间,我有一个字符串形式的时间戳。例如:

时间戳=“星期二,2013年2月12日7时43分09秒格林尼治标准时间”

我试图找到这个时间戳和使用日期时间模块在Python本时间之间的差。但由于某些原因,它给人的错误:

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

您是否遇到了计算不带时区转换差异的特定问题(例如,如果您跳过对时区的调用,它是否正常工作)? – Hannele 2013-02-12 23:47:56

回答

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 
+0

感谢您发现错误。我更新了代码。但我仍然得到错误。 – 2013-02-12 23:50:00

+0

也读取了datetime.timedelta对象。 – 2013-02-12 23:52:01

+0

明白了!非常感谢Craig。我被转换搞乱了。 – 2013-02-12 23:57:45

2

这里的问题是,t没有一个时区,这就是错误消息的“天真的日期时间”的意思。从the docs

There are two kinds of date and time objects: “naive” and “aware”… An aware object has sufficient knowledge of… time zone and daylight savings time information… A naive object does not…

您可以验证它是做这个天真:

print(t.tzinfo) 

答案将是None

由于astimezone docs说:

self must be aware (self.tzinfo must not be None , and self.utcoffset() must not return None).

strptime功能总是生成一个天真的日期时间。

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

  • 首先转换t为GMT日期时间,而不是一个天真的一个,然后将转换为'US/Pacific'会工作。

正如文档所言,“如果您只想将时区对象tz附加到日期时间dt而不调整日期和时间数据,请使用dt.replace(tzinfo=tz)。”既然你知道时间是UTC,只需要replace与UTC的空tz,你有一个意识到的时间。

  • 使用与astimezone不同的机制转换为PST,其中将采用UTC或允许您指定源的机制。

有不同的选择,但你已经使用pytz,所以请参阅its documentation

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

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

如果您需要在PST中显示最终结果,通常以UTC计算算术效果更好,并在结束时进行转换。 (例如,您可以有两次相隔一小时,但是在太平洋地区有相同的值,因为DST日的凌晨1点会重复两次;如果您始终保持UTC的状态,这不会成为问题。)

+0

非常感谢@abarnert的解释。我会接受你的建议并以UTC来进行算术。 – 2013-02-13 01:52:29

+0

@PrakharMehrotra:当然,Craig McQueen在我写完答案之前已经给出了这个建议......但是你已经接受了他的答案,所有事情都应该如此。 – abarnert 2013-02-13 18:31:35