Django хранит все DateTimeField в UTC при USE_TZ=True. Конвертация в локальное время происходит при отображении.
Настройка
# settings.py
USE_TZ = True # включить поддержку таймзон (рекомендуется)
TIME_ZONE = 'Europe/Moscow' # серверная таймзона
Aware vs Naive datetime
from django.utils import timezone
from datetime import datetime
# Aware — datetime с таймзоной (правильно при USE_TZ=True)
now = timezone.now() # UTC datetime с tzinfo
# Naive — без таймзоны (опасно!)
naive = datetime.now() # локальное время без tzinfo
Работа с датами
from django.utils import timezone
# Текущее время (UTC)
now = timezone.now()
# Текущая дата в локальной таймзоне
today = timezone.localdate()
# Перевод в локальное время
local_now = timezone.localtime(now)
# Конвертация aware datetime
from django.utils.timezone import make_aware
import pytz
moscow = pytz.timezone('Europe/Moscow')
aware = make_aware(datetime(2024, 1, 15, 12, 0), moscow)
Хранение в БД
Django хранит все DateTimeField в UTC при USE_TZ=True. Конвертация в локальное время происходит при отображении.
В шаблоне
{# Автоматически конвертирует в локальную таймзону #}
{{ task.created_at|date:"d.m.Y H:i" }}
{# Принудительно задать таймзону в шаблоне #}
{% load tz %}
{% timezone "Europe/Moscow" %}
{{ task.created_at }}
{% endtimezone %}
Переключение таймзоны для пользователя
from django.utils import timezone
def set_timezone(request):
if request.method == 'POST':
tz = request.POST.get('timezone')
request.session['django_timezone'] = tz
return redirect('/')
# middleware
class TimezoneMiddleware:
def __call__(self, request):
tzname = request.session.get('django_timezone')
if tzname:
timezone.activate(pytz.timezone(tzname))
else:
timezone.deactivate()
return self.get_response(request)
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!