Подтвердить что ты не робот

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, чтобы получить разницу во времени с момента публикации сообщения до этого момента, согласно документу, DateTimeField должен быть способен автоматически преобразовываться в дату-время, это правильно? Почему выражение о печати никогда не запускается? Как вы можете извлечь разницу во времени?

Кроме того, если вы получаете разницу во времени, есть простой способ преобразования разницы во времени в целое число, например, количество секунд общего времени.

4b9b3361

Ответ 1

Ваш код уже работает; объект 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 объект, так как Джанго DateTimeField ручки часового пояс, знающие datetime - 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), вычисления между ними учитывают часовые пояса, и вычитание одного из другого сделает правильную вещь, когда дело доходит до учета часовых поясов любого объекта.

Ответ 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.

Ответ 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;