2016-01-29 15 views
8

Widziałem ten post Is Django corrupting timezone-aware DateTimeField when saving it to the Database?, ale w szczególności używa on pytz i mysql i czego nie używać tam, gdzie nie używam pytz i używam SQLite (może to mieć wpływ).Django datetimefield timezone aware CET

Mam następujący model

class ScheduleItem(models.Model): 
    work_date = models.DateTimeField('Work date') 

I wstawić dane w następujący sposób:

from isoweek import Week 
from dateutil import parser 
from django.utils import timezone 

def foo() 
    year = 2016 #hardcoded for example purpose 
    wknr = 2 #hardcoded for example purpose 
    dateObj = parser.parse(Week(year, wknr).day(0).isoformat() + " 00:00:00") 
    print(dateObj) # 2016-01-11 00:00:00 as expected 
    final = timezone.make_aware(dateObj) 
    print(final) # 2016-01-11 00:00:00+01:00 as expected 
    return final 


workdate = foo() 
si = ScheduleItem(work_date=workdate) 
si.save() 

Sprawozdania drukowania dają mi odpowiednią moc, jednak gdy patrzę w bazie danych (SQLite) I zobacz 2016-01-10 23:00:00

Moje ustawienia Django powiedzieć

TIME_ZONE = 'CET' 
USE_TZ = True 

pobierania danych uzyskać:

datetime.datetime(2016, 1, 10, 23, 0, tzinfo=<UTC>) 

Dlaczego jest przechowywanie danych w innym formacie, a następnie określić, czy i dlaczego Django ma zostać stref czasowych świadomy mogę uzyskać czasową UTC powrotem? To znaczy przed wprowadzeniem obiekt datetime mówi: datetime.datetime(2016, 1, 11, 0, 0, tzinfo=<DstTzInfo 'CET' CET+1:00:00 STD>)

aktualizacji -

znalazłem pracę wokół w międzyczasie przez ustawienie TIME_ZONE w bazie danych, jak opisano w dokumentacji Django here. To daje mi prawo czasowej/datę w bazie danych, ale według tej dokumentacji nie powinno to potrzebne, ponieważ mój DB jest zarządzany przez Django

Pozwala interakcji z bazami danych firm trzecich, które przechowują w datetimes czas lokalny zamiast UTC. Aby uniknąć problemów związanych ze zmianami czasu letniego, nie powinieneś ustawiać tej opcji dla baz danych zarządzanych przez Django.

Nadal jest dla mnie jasne, dlaczego Django ma konwertować obiekt datetime ze strefy czasowej CET UTC podczas przechowywania go w bazie danych, ale nie jest na tyle silny, aby przekształcić go z powrotem do czasu środkowoeuropejskiego przy pobieraniu.

Odpowiedz

4

Django wykorzystuje czas UTC wewnętrznie. TIME_ZONE będzie używany „dla swoich poglądów i modeli” (https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-TIME_ZONE)

Zacząłeś z 2016-01-11 00:00 CET, który jest 2016-01-10 23:00 UTC! Twoja data i godzina została poprawnie zapisana w bazie danych, a następnie przywrócona, więc wszystko działa zgodnie z oczekiwaniami.

+0

Mogę teraz zrozumieć i zaakceptować, że ORM Django zajmuje się konwersją i przechowywanie datetime w UTC w bazie danych w zależności od kombinacji 'USE_TZ' i' TIME_ZONE'. Jednak z tej samej sekcji "wszystkie widoki i modele będą działać automatycznie w tej strefie czasowej" To się nie dzieje. Podczas pobierania datetime za pośrednictwem modelu/ORM otrzymuję UTC, a nie wersję CET, jak wskazano w moich ustawieniach. Oczywiście mogę użyć 'timezone.localtime()' Django do konwersji tego, co pobrałem, ale nie o to chodzi. Wykonuje tylko połowę wymaganych operacji. – ixje

+0

Ta sekcja może być nieco bardziej przejrzysta: TIME_ZONE jest używany podczas wyświetlania informacji skierowanych do użytkownika. Wypróbuj za pomocą tagu szablonu humanizuj, wierzę, że wyświetli się czas CET. – knite

+0

Zdecydowałem się przyznać ci nagrodę za odpowiedź, która przynajmniej odpowiedziała na jedną część pytania i pozwoliła mi zrozumieć część wewnętrznych elementów. Dlaczego nie przywraca mojego świadomego obiektu datetime może być wyborem projektu Django i może być uważany za stronę zakresu pytania. – ixje

Powiązane problemy