Django: jak uświadomić obiekt datetime o strefie czasowej, w której został utworzony?

Uruchamiam program, który żąda danych o falach oceanicznych ze zdalnego serwera. time i date tych danych są obliczane w oparciu o lokalną strefę czasową mojej maszyny. Chcę użyć tych lokalnych dat i godzin, aby utworzyć obiekt datetime, który następnie zapiszę w modelu Django.

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

Jak upewnić się, że obiekt datetime jest świadomy, że został utworzony w oparciu o lokalną strefę czasową, przed wysłaniem go do Django?

Myślę, że chciałbym, aby wyglądało to tak, zanim zamieszczanie go:

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

Jak dynamicznie uzyskać lokalną strefę czasową mojej maszyny? I jak upewnić się, że wszyscy użytkownicy widzą czas przekonwertowany na ich własną lokalną strefę czasową.

Author: sgarza62, 2014-03-01

2 answers

Najpierw upewnij się, że znasz dokumentację Django w strefach czasowych, set USE_TZ = True I install pytz.

Nie do końca rozumiem, skąd pochodzi twoja randka. Jeśli pochodzi on z serwera jako część ich danych (tj. reprezentuje moment pomiaru pływów), powinien być już w UTC lub musisz znać strefę czasową, której używają. Jeśli go tworzysz, najprostszą rzeczą jest użycie django.utils.timezone.now() (która zwraca świadomą strefę czasową datetime) podczas tworzenia instancji modelu.

Jeśli naprawdę potrzebujesz ręcznie utworzyć go zgodnie z opisem, wykonaj użycie tutaj :

import pytz
datetime_obj = datetime(loc_year, loc_month, loc_date, loc_hour, loc_minute)
pytz.timezone("Europe/Helsinki").localize(datetime_obj)

Zamiast" Europa/Helsinki " można uzyskać domyślną strefę czasową z django.utils.timezone.get_default_timezone_name(). Będzie to strefa czasowa zdefiniowana za pomocą TIME_ZONE ustawienia, i może nie być rzeczywistą strefą czasową systemu. Uzyskanie strefy czasowej systemu w formacie, który pytz może zrozumieć, jest omówione w to odpowiedź .

Wreszcie, zapewnienie, że użytkownicy zobaczą czas zamieniony na ich lokalną strefę czasową jest nietrywialne, jak omówiono tutaj :

Bieżąca Strefa czasowa jest odpowiednikiem bieżącego ustawienia lokalnego dla tłumaczeń. Jednak nie ma odpowiednika nagłówka HTTP Accept-Language, którego Django mógłby użyć do automatycznego określenia strefy czasowej użytkownika. Zamiast tego Django dostarcza funkcje wyboru strefy czasowej. Użyć ich do zbudowania logiki wyboru strefy czasowej, która to ma dla ciebie sens.

Zobacz przykłady tam dla wskazówek.

 31
Author: Kevin Christopher Henry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:24
from django.utils import timezone
import pytz

timezone.activate(pytz.timezone("Asia/Kolkata"))
timezone.localtime(timezone.now())
 5
Author: HimalayanCoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-05 06:07:50