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.