Как заставить Django DateTimeField хранить тихоокеанское время в формате UTC - PullRequest
0 голосов
/ 25 апреля 2019

После прочтения многих документов меня смущает 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) В базе данных я ожидаю увидеть сохраненное время: Тихоокеанская дата + время.

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) Если время базы данных тихоокеанское, сравнение допустимо.

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

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

1 Ответ

0 голосов
/ 25 апреля 2019

Я получил его на работу, но меня больше смущают настройки часового пояса 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' и не могу получить db для хранения тихоокеанского времени.

...