Campo datetime de Django: convertir a la zona horaria a la vista

Tengo un modelo de Django con un campo de fecha y hora . Cuando se guarda, el campo de fecha y hora almacenado en mi base de datos pierde la información de la zona horaria, por lo que se guarda como una fecha y hora ingenua . En general, esto no es un problema, ya que Django lo vuelve a convertir automáticamente al representar el campo de fecha y hora en la plantilla.

Pero ¿qué pasa con la vista? Digamos que necesito la representación de cadena del lado del servidor de fecha y hora. Dependiendo del horario de verano / invierno, mi zona horaria podría ser GTM + 1 o GMT + 2, lo que dificulta las cosas.

Entonces, ¿cómo aplico la conversión tz local en la vista ? He intentado varias maneras con pytz. Sin éxito, algunas entradas se convierten a GMT + 1 y otras a GMT + 2 🙁

P.ej.

system_tz = pytz.timezone('Europe/Berlin') local_dt = item.created_at.astimezone(system_tz) local_dt = system_tz.normalize(local_dt) 

Información adicional:

  • Django 1.8.7.
  • settings.USE_TZ = Verdadero
  • MySQL
  • ¿Por qué estoy haciendo esto? Porque tengo una tabla que carga todas sus filas a pedido a través de AJAX. Necesito preparar los valores de fecha y hora con strftime () antes de enviarlos al cliente.

 from django.utils import timezone local_dt = timezone.localtime(item.created_at, pytz.timezone('Europe/Berlin')) 

Para convertir a UTC + 1:

 from django.utils import timezone local_dt = timezone.localtime(item.created_at, timezone.get_fixed_timezone(60) 
  • Cómo obtener la hora local en la zona horaria actual (segunda pregunta)
  • hora local()
  • get_fixed_timezone ()

No hay necesidad de usar django.utils para convertir entre zonas horarias:

 berlin = pytz.timezone('Europe/Berlin') local_dt = item.created_at.astimezone(berlin) 

Sin embargo, si normalmente trabaja con una sola zona horaria, es conveniente almacenarlo en la settings.TIME_ZONE = 'Europe/Berlin' y luego

 local_dt = timezone.localtime(item.created_at) 

lo convertirá a su hora local.