2009-08-11 28 views
31

En un modelo Tengo un tal campo: mydate = models.DateField()django Datefield para Unix timestamp

ahora una función de gráfico javascript requiere UNIX timestamp como "1196550000000", ¿Cómo puedo devolver la marca de tiempo Unix de mi entrada mydate

Gracias

+8

1196550000000 no es una marca de tiempo Unix, a menos que estamos hablando del año 37 942 o algo así. – hop

+1

Parece una marca de tiempo de JavaScript, ms desde unix epoch. – 0atman

Respuesta

27

edit: por favor, compruebe la segunda respuesta, tiene una solución mucho mejor

En el código Python, que puede hacer esto para convertir una fecha o de fecha y hora a la Época Unix

import time 
epoch = int(time.mktime(mydate.timetuple())*1000) 

Este no funciona en una plantilla de Django sin embargo, por lo que necesita un filtro personalizado, por ejemplo:

import time 

from django import template 

register = template.Library() 

@register.filter 
def epoch(value): 
    try: 
     return int(time.mktime(value.timetuple())*1000) 
    except AttributeError: 
     return '' 
+0

lo que no entiendo: ¿por qué no utilizar el método strftime() de la clase de fecha y deshacerse por completo del módulo de tiempo? – hop

+0

hop: 'strftime()' devuelve una cadena, que no siempre es la que desea. – Timmmm

+4

¡Vea la respuesta más alta marcada, es la correcta! – Pykler

5

En su views.py, puede convertir el valor de mydate a segundos desde la época Unix de la siguiente manera:

seconds = time.mktime(mydate.timetuple()) 

Luego pasarlo en el diccionario se utiliza como argumento para render_to_response() (o lo que sea que esté usando para representar su vista), y en su plantilla, pegue {{seconds}} en un campo oculto, que luego puede sacar del DOM para pasar a su función de gráficos de JavaScript.

Tenga en cuenta que un DateField corresponde al objeto Python datetime.date, y como tal, su timetuple tendrán sus horas, minutos y segundos campos establecidos a 0. Si eso no es suficiente grano fino para usted, usted tiene que cambiar mydate a DateTimeField y será datetime.datetime. Todavía puede usar mydate.timetuple() si hace esto.

Además, supongo que está utilizando la hora local. Si está utilizando la hora UTC, desea calendar.gmtime() en lugar de time.mktime() y mydate.utctimetuple() en lugar de mydate.timetuple(), pero utctimetuple() es solo un método válido para los objetos datetime.datetime. Consulte los documentos datetime (también time y calendar) para obtener más detalles inquietos.

EDITAR: detalles complicados como el hecho de que mktime() devuelve un flotador, que piquadrat recordaba y yo no. El enfoque de filtro personalizado también es bueno. Votando eso.

94

sé otra respuesta fue aceptada hace un tiempo, pero esta pregunta aparece alta en los resultados de búsqueda de Google, así que agregaré otra respuesta.

Si está trabajando a nivel de plantilla, puede utilizar el U parameter al filtro date, por ejemplo .:

{{ mydate|date:"U" }} 

Nota que se basa en la TIMEZONE en su settings.py.

+0

Dado que esta solución es tan baja sin votos, pensé que mencionaría que funcionó para mí sin ningún problema. Gracias. – michaelavila

+1

Tengo problemas para que funcione. Puedo obtener la fecha y la hora de salida usando * cualquier otro conjunto de banderas *, pero cuando trato de usar la bandera "U" obtengo una cadena vacía. Estoy aturdido. –

+2

+1, esto es exactamente lo que necesitaba. – Exelian

61

Y si no se encuentra en la capa de la plantilla, puede utilizar los mismos django utils subyacentes.Ej:

from django.utils.dateformat import format 
print format(mymodel.mydatefield, 'U') 
+2

Para referencia: https://github.com/django/django/blob/master/django/utils/dateformat.py – Paolo

+2

Después de leer la respuesta anterior estaba buscando exactamente esto. –

1

Otra opción:

import time 
from django.utils import timezone 

naive_date = timezone.make_naive(mydate, timezone.get_current_timezone()) 
print int(time.mktime(naive_date.timetuple())) 
Cuestiones relacionadas