Django:如何从时间发布中获得时间差?

新手上路,请多包涵

假设我在模型中上课

 class Post(models.Model):
     time_posted = models.DateTimeField(auto_now_add=True, blank=True)

     def get_time_diff(self):
         timediff = timediff = datetime.datetime.now() - self.time_posted
         print timediff # this line is never executed
         return timediff

我定义了一个get_time_diff来获取post发布到现在的时间差,根据文档,DateTimeField应该可以自动转换为datetime,对吗?为什么打印语句永远不会运行?你如何提取时差?

此外,如果你得到时差,有没有一种简单的方法可以将时差转换为整数,比如总时间的秒数。

原文由 Bob Fang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 806
2 个回答

您的代码已经在运行;返回一个 datetime.timedelta 对象

要获取总 _秒数_,您需要对生成的 timedelta 调用 .total_seconds() 方法

 from django.utils.timezone import utc

def get_time_diff(self):
    if self.time_posted:
        now = datetime.datetime.utcnow().replace(tzinfo=utc)
        timediff = now - self.time_posted
        return timediff.total_seconds()

.total_seconds() 返回一个 float 值,包括微秒。

请注意,您需要使用 时区感知 datetime 对象,因为 Django DateTimeField 处理时区感知 datetime 对象。请参阅 Django 时区文档

.total_seconds() 的演示(用天真的 datetime 对象,但原理是一样的):

 >>> import datetime
>>> time_posted = datetime.datetime(2013, 3, 31, 12, 55, 10)
>>> timediff = datetime.datetime.now() - time_posted
>>> timediff.total_seconds()
1304529.299168

因为这两个对象都是时区感知的(有一个 .tzinfo 不是 None 的属性),它们之间的计算处理时区并且从另一个中减去一个会做正确的事情考虑到任一对象的时区。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

假设您在模板中执行此操作,您还可以使用 timesince 模板标签。

例如:

 {{ blog_date|timesince:comment_date }}

原文由 Wolph 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题