Django:如何从时间上获得时差?

时间:2013-04-15 13:09:14

标签: python django datetime django-models

说我有一个模特课

 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,这是正确的吗?为什么print语句永远不会运行?你怎么能提取时差?

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

4 个答案:

答案 0 :(得分:31)

您的代码已经正常运行;返回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),所以它们之间的计算会处理时区,而从另一个中减去一个将会做正确的事情。考虑到任一对象的时区。

答案 1 :(得分:6)

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

例如:

{{ blog_date|timesince:comment_date }}

答案 2 :(得分:0)

您的代码

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

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

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

答案 3 :(得分: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;