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