2013-04-15 2 views
11

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

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

+0

Это старый, но я заметил, что никто не ответил на ваш вопрос о печати. Возможно, ваш запрос на печать работает, но вы не увидите его на своем сайте. печать работает только в консоли. Если вы посмотрите на свои журналы, вы найдете свое сообщение для печати. – ryechus

ответ

26

Ваш код уже работает; возвращается datetime.timedelta object.

Чтобы получить общее количество секунд вместо этого, вы должны вызвать .total_seconds() method на результирующее 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 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), расчеты между ними ухаживать часовых поясов и вычитания одного из другого будут делать правильные вещи, когда речь заходит о том, чтобы учитывать временные интервалы любого объекта.

+0

+1 - Не знал о методе 'total_seconds()'. :) – Aya

+0

Спасибо, но в моем случае time_posted является DateTimeField. Я пробовал, он не работает. – dorafmon

+0

@dorafmon: в вашем пользовательском методе модели 'self.time_posted' возвращает экземпляр' datetime', см. [Методы модели] (https://docs.djangoproject.com/en/1.5/topics/db/models/#model- методы). –

0

Ваш код

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

должны работать, чтобы получить разницу во времени. Однако это возвращает объект timedelta. Чтобы получить разницу в секундах вы используете .seconds атрибут

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

Я не думаю, что это сработает, если разница больше одного дня. – Aya

+0

@Aya, думаю. Вы знаете, почему это не так? – Rohan

+0

Хорошо, [docs] (http://docs.python.org/2/library/datetime.html) говорят, что атрибут 'seconds' -« Между 0 и 86399 включительно ». – Aya

3

Предполагая, что вы делаете это в шаблоне, вы также можете использовать тег шаблона timesince.

Например:

{{ blog_date|timesince:comment_date }} 
Смежные вопросы