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ą.
2 answers
Najpierw upewnij się, że znasz dokumentację Django w strefach czasowych, set USE_TZ = True
I install pytz
.
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.
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())
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