26

假设我有一个模型类

 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应该可以自动转换为日期时间,对吗?为什么 print 语句永远不会运行?如何提取时差?

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

4

4 回答 4

37

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

要获取总秒数,您需要在结果上调用该.total_seconds()方法timedelta

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

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

于 2013-04-15T13:15:53.860 回答
11

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

例如:

{{ blog_date|timesince:comment_date }}
于 2013-04-15T13:27:26.020 回答
1

你的代码

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

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

timediff = datetime.datetime.now() - self.pub_date
timediff.seconds  # difference in seconds.
于 2013-04-15T13:13:28.680 回答
0

以防万一你想把这个过程放在你的 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;
于 2019-07-07T08:32:18.833 回答