Как создать поле Django DateTimeField для хранения тихоокеанского времени в формате UTC

#django #timezone #utc

#django #Часовой пояс #utc

Вопрос:

После прочтения многих документов меня смущает UTC, часовой пояс UTC и то, как он используется в Django.

Формат UTC и часовой пояс UTC — это одно и то же? Может ли формат UTC хранить дату время тихоокеанского часового пояса?

У меня есть проект django с базой данных и пользовательским интерфейсом.

 class FunModel(models.Model):
   fun_time = models.DateTimeField()
  

Чего я ожидаю:

1) Страница 1. нажмите кнопку в браузере в тихоокеанском часовом поясе. Сервер для создания / сохранения (на стороне сервера, а не клиента для создания времени) ‘fun_time’ как дата время тихоокеанского часового пояса (не зона UTC, но формат соответствует формату UTC)

2) Страница 2. При загрузке страницы 2. он извлекает время как тихоокеанскую дату время (не зону UTC)

3) В базе данных я ожидаю увидеть, что сохраненное время является тихоокеанской датой time.

4) Насколько я понимаю, класс FunModel будет хранить время как тихоокеанское время в формате UTC. Часовой пояс настраивается в настройках.

 ----Settings.py

# Tried 'US/Pacific' as well. No difference. Date time stored in db is the same. Really confused!
TIME_ZONE = 'UTC'  

# Only for retrieving date from db to be Pacific by calling active(USER_TIME_ZONE)? 
USER_TIME_ZONE = 'US/Pacific'  

# With above 2 settings, date stored/retrieved will be Pacific zone automatically. Not really!

USE_I18N = True
USE_L10N = True
USE_TZ = True
  

Я ожидаю, что база данных будет хранить время как часовой пояс США / Тихого океана, а формат времени — UTC (всегда формат UTC правильный?)

 ----Page1_Save.py
from django.utils import timezone

timezone.activate(settings.USER_TIME_ZONE)
time_param = timezone.localtime(timezone.now())

fun_time_obj = FunModel(fun_time=time_param)
fun_time_obj.save()

# time_param = 2019-04-16 01:00:00
# database: 2019-04-16 01:00:00   7 hours = 2019-04-16 08:00:00  (Not correct!)
  

Я ожидаю базу данных: 2019-04-16 01:00:00.

Я также пытался,

 time_param = timezone.now()
  

Тот же результат:

 # time_param = 2019-04-16 01:00:00
# database: 2019-04-16 01:00:00   7 hours = 2019-04-16 08:00:00  (Not correct!)
  

Где я сделал неправильно?

 ---Page2_Load.py  (Use Q to compare date stored in db)

# Browser in Pacific timezone without timezone passed to server. Just time picked from Javascript.
ui_date = '2019-04-16 01:00:00' 
  

Я хочу использовать функцию Q для сравнения:

 Q(fun_time__exact=ui_date)
  

A) Если время базы данных равно тихоокеанскому времени, сравнение допустимо.

Б) Если время базы данных равно времени UTC, сравнение недопустимо. Теперь я не могу сравнить дату, хранящуюся в базе данных!!! Как это исправить?

C) Я не хочу, чтобы дата время в базе данных были часовым поясом UTC!!!

Комментарии:

1. Какую базу данных вы используете?

2. база данных mysql.

3. UTC не является форматом. Любое обсуждение «формата UTC» бессмысленно. Это все равно, что сказать, что вам нравятся шоколадные машинки. Вам могут нравиться красные машины и шоколадный торт, но это очень разные вещи.

4. Я не хочу, чтобы дата время в базе данных были часовым поясом UTC!!! Тогда вы не сможете установить USE_TZ значение True . Смотрите первое предложение документации по часовому поясу.

5. USE_TZ = False. часовой пояс.активировать (настройки. ПОЛЬЗОВАТЕЛЬСКАЯ ВРЕМЕННАЯ зона) time_param = часовой пояс. местное время (timezone.now()) (Чтобы сохранить тихоокеанское время в базе данных) приведет к ошибке: ValueError: localtime () не может быть применен к наивному datetime. timezone.now() получит время в часовом поясе UTC (на 7 часов раньше тихоокеанского). Как получить тихоокеанское время и сохранить тихоокеанское время в базе данных?

Ответ №1:

Я заставил это работать, но меня больше смущают настройки часового пояса Django.

Системные часы сервера соответствуют часовому поясу UTC.

—settings.py

 # Totally useless
#TIME_ZONE = 'UTC'  # comment out, and server runs well.

# I suspect this is useless as well. 
USER_TIME_ZONE = 'US/Pacific'  

USE_I18N = True
USE_L10N = True
USE_TZ = False   # Make server timezone not aware.
  

—page1_save.py

   from datetime import datetime
  import  pytz
  utc = pytz.utc.localize(datetime.utcnow())  # Generate time from server, which is UTC timezone
  instance_time_zone = pytz.timezone('US/Pacific')  
  time_param = utc.astimezone(instance_time_zone)
  time_param = time_param.replace(tzinfo=None)  # USE_TZ = False. Make it without timezone.

  fun_time_obj = FunModel(fun_time=time_param)
  fun_time_obj.save()
  

Теперь время в базе данных равно тихоокеанскому времени, чего я и ожидаю.

TIME_ZONE, USER_TIME_ZONE бесполезны в этом случае, когда USE_TZ = False. Кроме того, использование USE_TZ = True, TIME_ZONE = ‘What ever’ также кажется бесполезным, поскольку я пробовал TIME_ZONE = ‘US / Pacific’, USER_TIME_ZONE = ‘US / Pacific’, и не могу получить базу данных для хранения тихоокеанского времени.