【问题标题】:Django: How to get a time difference from the time post?Django:如何从时间帖子中获得时差?
【发布时间】:2013-04-07 14:46:58
【问题描述】:

假设我在模型中有一个类

 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来获取从发布到现在的时间差,根据文档,DateTimeField应该可以自动转换为datetime,对吗?为什么 print 语句永远不会运行?如何提取时差?

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

【问题讨论】:

  • 这是旧的,但我注意到没有人回答你关于打印的问题。您的打印声明可能正在工作,但您不会在您的网站上看到它。 print 仅在控制台中有效。如果您查看您的日志,您会发现您的打印信息。

标签: python django datetime django-models


【解决方案1】:

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

要获取 的总数,您需要在结果 timedelta 上调用 .total_seconds() method

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 Timezones documentation

.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),所以它们之间的计算会处理时区,并且在考虑到时区时从另一个中减去一个会做正确的事情任一对象的时区。

【讨论】:

  • 首先谢谢,但在我的例子中,time_posted 是一个 DateTimeField。我试过了,还是不行。
  • @dorafmon:在您的自定义模型方法中self.time_posted 返回一个datetime 实例,请参阅Model Methods
  • @dorafmon ...尽管blank=True 表明您可能无法返回有效的datetime,因此您可能需要在进行减法之前检查其有效性。
  • @Aya:很有趣,把blank=True 弄乱了。添加了if 语句,现在如果self.time_posted 未定义,get_time_diff 将返回None
  • @aorcsik:坚持使用 UTC,您可以省去所有这些麻烦。
【解决方案2】:

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

例如:

{{ blog_date|timesince:comment_date }}

【讨论】:

  • 最佳答案谢谢
  • 谢谢!知道如何以秒为单位获得结果持续时间吗?
【解决方案3】:

你的代码

timediff = datetime.datetime.now() - self.pub_date

应该努力获得时差。但是,这会返回 timedelta 对象。要获得秒数差异,请使用 .seconds 属性

timediff = datetime.datetime.now() - self.pub_date
timediff.seconds  # difference in seconds.

【讨论】:

  • 如果差值超过一天,我认为这不会起作用。
  • @Aya,我想会的。你知道为什么它不会吗?
  • 好吧,the docsseconds 属性是“介于 0 和 86399 之间”。
  • @Rohan:有一个单独的.days 属性。 .seconds 只包含余数;一个 10 天 534 秒年龄的事件有一个.seconds 属性和534,它的.days 属性将是10。使用.total_seconds() 将其转换为仅秒值。
【解决方案4】:

以防万一你想把这个过程放在你的 Django 信号中。这是为我工作的那个。希望这会有所帮助!

from django.db.models.signals import pre_save
from django.dispatch import receiver
from .models import YourModel
from datetime import datetime

@receiver(pre_save, sender = YourModel)
def beforeSave(sender, instance, **kwargs): 
     date_format = "%H:%M:%S"

     # Getting the instances in your model.
     time_start = str(instance.time_start)
     time_end = str(instance.time_end)

     # Now to get the time difference.
     diff = datetime.strptime(time_end, date_format) - datetime.strptime(time_start, date_format)

     # Get the time in hours i.e. 9.60, 8.5
     result = diff.seconds / 3600;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2013-03-04
    相关资源
    最近更新 更多