Django: Как сделать объект datetime осведомленным о часовом поясе, в котором он был создан?

Я запускаю программу, которая запрашивает данные об океане с удаленного сервера. Данные time и date данных приливов вычисляются на основе локального часового пояса машины. Я хочу использовать эти локальные даты и время для создания объекта datetime, который затем сохраню в модели Django.

datetime_obj = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute)

Как обеспечить, чтобы объект datetime знал, что он был создан на основе локального часового пояса, прежде чем отправлять его в Django?

Полагаю, мне хотелось бы, чтобы это выглядело так, прежде чем публиковать его:

datetime_obj = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute, loc_timezone)

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

Ответ 1

Сначала убедитесь, что вы знакомы с документацией Django о часовых поясах, установите USE_TZ = True и установите pytz.

Я не совсем понимаю, откуда твое свидание. Если он поступает с сервера как часть их данных (то есть он представляет собой время измерения приливов), он должен быть либо в UTC, либо вам нужно будет знать часовой пояс, который они используют. Если вы создаете его, то самое простое - просто использовать django.utils.timezone.now() (который возвращает дату и время с учетом часового пояса) при создании экземпляра модели.

Если вам действительно нужно создать его вручную, как вы описали, следуйте инструкциям здесь или используйте make_aware():

from django.utils.timezone import make_aware

naive = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute)
make_aware(naive)  # current timezone, or...
make_aware(naive, timezone=pytz.timezone("Europe/Helsinki"))  # ...specific timezone

текущий часовой пояс будет часовым поясом по умолчанию (как определено параметром TIME_ZONE), если вы не использовали activate(), чтобы указать другой. Часовой пояс по умолчанию может совпадать или не совпадать с часовым поясом системы сервера. Получение системного часового пояса в формате, понятном pytz, обсуждается в этом ответе.

Наконец, обеспечение того, чтобы пользователи видели время, преобразованное в их локальный часовой пояс, нетривиально, как обсуждалось здесь:

Текущий часовой пояс является эквивалентом текущей локали для переводов. Однако нет эквивалента HTTP-заголовка Accept-Language, который Django мог бы использовать для автоматического определения часового пояса пользователя. Вместо этого Django предоставляет функции выбора часового пояса. Используйте их для построения логики выбора часового пояса, которая имеет смысл для вас.

Смотрите примеры там для руководства.

Ответ 2

from django.utils import timezone
import pytz

timezone.activate(pytz.timezone("Asia/Kolkata"))
timezone.localtime(timezone.now())