python sqlite django-models django-timezone

python - Django datetimefield timezone aware CET



sqlite django-models (1)

Django usa el tiempo UTC internamente. TIME_ZONE se usará "para sus vistas y modelos" ( https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-TIME_ZONE )

2016-01-11 00:00 CET con 2016-01-11 00:00 CET , que es 2016-01-10 23:00 UTC ! Su fecha y hora se guardó correctamente en la base de datos y luego se restauró, por lo que todo está funcionando como se esperaba.

Vi esta publicación. ¿Django está corrompiendo el DateTimeField de la zona horaria al guardarlo en la base de datos? pero específicamente usa pytz y mysql y qué no, donde no uso pytz y uso SQLite (en caso de que pueda tener un impacto).

Tengo el siguiente modelo

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

E inserto datos de la siguiente manera:

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()

Las instrucciones de impresión me dan el resultado correcto, sin embargo, una vez que miro en la base de datos (SQLite) veo 2016-01-10 23:00:00

Mi configuración django dice

TIME_ZONE = ''CET'' USE_TZ = True

Recuperando los datos que obtengo:

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

¿Por qué está almacenando los datos en otro formato, luego especifico y por qué si Django está configurado para ser consciente de la zona horaria, ¿me devuelven una zona horaria UTC? Quiero decir, antes de la inserción el objeto datetime dice: datetime.datetime(2016, 1, 11, 0, 0, tzinfo=<DstTzInfo ''CET'' CET+1:00:00 STD>)

actualización -

Mientras tanto, encontré un trabajo TIME_ZONE configurar TIME_ZONE en la base de datos como se describe en la documentación de Django aquí . Esto me da la zona horaria correcta / fecha en la base de datos, pero de acuerdo con esa documentación no debería necesitarlo porque mi DB está administrado por Django.

Esto permite interactuar con bases de datos de terceros que almacenan fechas y horas en vez de UTC. Para evitar problemas relacionados con los cambios del horario de verano, no debe establecer esta opción para las bases de datos administradas por Django.

Todavía no está claro para mí por qué Django convierte un objeto datetime con una zona horaria CET en UTC cuando lo almacena en la base de datos, pero no es lo suficientemente inteligente como para volver a convertirlo en CET al recuperar.