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

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

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

self.class_date - это DateTimeField self.class_date.is_aware() часового пояса, self.class_date.is_aware() - True, USE_TZ - True.

ShortDescription возвращает строку, в которой указано время в формате UTC, а не в часовом поясе по умолчанию, {{ aclass.class_date }} в шаблоне {{ 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')