Django – strefa czasowa

Pisząc aplikację na ogół chcemy, żeby panował porządek w zmiennych typu datetype. Opieranie się na czasach lokalnych serwera na którym uruchomiona jest aplikacja i serwera bazy danych może prowadzić do bałaganu w najlepszym razie, kiedy strefy czasowe tych serwerów nie są zgodne a co gorsza inne niż strefa czasowa w której funkcjonują użytkownicy aplikacji. Warto więc zadbać o odpowiednią konfigurację.

Domyślnie aplikacja napisana w Django ustawiała zmienną TIME_ZONE, odpowiedzialną za definicję lokalnej strefy czasowej na ‚America/Chicago’, domyślnie, czyli jeśli nie zostało to zmienione w ustawieniach czyli w pliku settings.py. W nowszych wersjach Django w pliku settings.py znajdziemy już wpis:

TIME_ZONE = 'UTC'

To już lepiej, jednak ta wartość może się mieć nijak do strefy czasowej lokalnej dla użytkowników aplikacji. A bywa, że rejestrowanie czasu jakiejś akcji (komentarz, wpis do bloga etc) jest jednak ważne. Warto więc zdefiniować tę wartość prawidłowo. Dla Polski wartość przesunięcia w stosunku do UTC wynosi 1 co oznacza się na ogół przez ‚UTC+1’ lub ‚UTC+01’, wartości dla innych krajów można sprawdzić w Wikipedii

Time zone UTC+01

Oczywiście to by było za łatwe, żeby można było napisać po prostu:

TIME_ZONE = 'UTC+01'

Należy użyć wartości znanej jako TZ database name, znajdziemy ją w tej samej tabeli w Wikipedii. Zatem dla naszej szerokości geograficznej możliwe są między innymi ustawienia:

TIME_ZONE = 'Africa/Algiers'
TIME_ZONE = 'CET'   //zdeprecjonowany
TIME_ZONE = 'Etc/GMT-1'
TIME_ZONE = 'Europe/Warsaw'
TIME_ZONE = 'MET'  //zdeprecjonowany

Należy pamiętać jeszcze o jednej kwestii. Samo nadanie nadanie wartości zmiennej TIME_ZONE nie przyniesie rezultatów i aplikacja będzie korzystać z czasu lokalnego serwera, który może być zupełnie inny niż strefa, którą chcemy ustawić, dopóki nie wymusimy korzystania ze zmiennej TIME_ZONE za pomocą ustawienia:

USE_TZ = True

Należy więc dopilnować, żeby i ta zmienna miała odpowiednią wartość.

I to właściwie wszystko co należy zrobić, żeby metoda datetime.datetime.now() zwracała prawidłową wartość.

Dodaj komentarz

%d bloggers like this: