Использование strftime в Django datetime создает время UTC в строке

У меня есть следующий код в одной из моих моделей:

def shortDescription(self):
    return self.name + ' ' + self.class_date.strftime("%I:%M")

self.class_date-это часовой пояс, знающий DateTimeField, self.class_date.is_aware () истинно, USE_TZ истинно.

shortDescription возвращает строку, которая дает время в UTC, а не часовой пояс по умолчанию, помещая {{ aclass.class_date }} в шаблоне отображается время в правильной зоне.

strftime всегда работает на базе, наивное время? Или что еще происходит здесь?

1 ответов


когда вы напрямую ссылаетесь на части datetime, такие как %I или %M, он использует его прямо, как это без преобразования локали. Если вы включили %Z вы увидите, что время в UTC. Если вам нужны результаты с учетом локали, вам нужно использовать более ограниченный %X, который просто выплюнет полное время, преобразованное для локали.

Если вам нужно больше, вам придется преобразовать его:

from django.utils import timezone

def shortDescription(self):
    class_date = timezone.localtime(self.class_date)
    return self.name + ' ' + class_date.strftime("%I:%M")

или, вы можете положиться на date фильтр, который автоматически делает это для вас:

from django.template import defaultfilters

def shortDescription(self):
    return self.name + ' ' + defaultfilters.date(self.class_date, 'g:i')