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.
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
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
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