2012-08-10 19 views
9

tengo el siguiente código en uno de mis modelos:strftime en una fecha y hora Django produce una hora UTC en la cadena

def shortDescription(self): 
    return self.name + ' ' + self.class_date.strftime("%I:%M") 

self.class_date es una zona horaria conscientes DateTimeField, self.class_date.is_aware() es Verdadero, USE_TZ es Verdadero.

shortDescription devuelve una cadena que da la hora en UTC en lugar de la zona horaria predeterminada, al poner {{aclass.class_date}} en la plantilla, se muestra la hora en la zona correcta.

¿Siempre estamos trabajando en la base, tiempo ingenuo? ¿O qué más está pasando aquí?

+0

Lo que hace que significa por "fecha de reconocimiento de zona horaria"? ¿Qué clase es? –

Respuesta

29

Cuando referencia directamente piezas de la fecha y hora como %I o %M, la usa directamente como está sin conversión de configuración regional. Si incluyó %Z, verá que la hora está en UTC. Si desea obtener resultados que tengan en cuenta la configuración regional, debe usar el %X, que es más limitado y que simplemente escupirá el tiempo completo convertido para la configuración regional.

Si necesita más, tendrá que convertirlo:

from django.utils import timezone 

def shortDescription(self): 
    class_date = timezone.localtime(self.class_date) 
    return self.name + ' ' + class_date.strftime("%I:%M") 

O bien, puede confiar en el filtro de date, lo que hace automáticamente para usted:

from django.template import defaultfilters 

def shortDescription(self): 
    return self.name + ' ' + defaultfilters.date(self.class_date, 'g:i') 
+0

Excelente. Y no sabía nada sobre el truco de defaultfilters. –

+1

Sí, lo uso todo el tiempo. Los filtros de plantilla de Django son solo métodos regulares, por lo que puede usar cualquiera de ellos en cualquier parte de su código. 'defaultfilters.slugify' también es útil con bastante frecuencia. –

+0

Perfecto .......... –

Cuestiones relacionadas