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

dor*_*mon 19 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
Run Code Online (Sandbox Code Playgroud)

我定义了一个get_time_diff来获取Post发布到现在的时间差,根据文档,DateTimeField应该能够自动转换为datetime,这是正确的吗?为什么print语句永远不会运行?你怎么能提取时差?

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

Mar*_*ers 31

你的代码已经运行了; 返回一个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()
Run Code Online (Sandbox Code Playgroud)

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

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

演示.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
Run Code Online (Sandbox Code Playgroud)

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

  • @aorcsik:通过坚持UTC,你可以省去所有这些令人头痛的问题. (2认同)

Wol*_*lph 6

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

例如:

{{ blog_date|timesince:comment_date }}
Run Code Online (Sandbox Code Playgroud)