django Datefield de timestamp Unix

dans un modèle j'ai un tel champ: madate = modèles.DateField ()

maintenant une fonction javascript graph nécessite un timestamp unix tel que "1196550000000", Comment puis-je retourner le timestamp unix de mon entrée mydate.

Merci

32
demandé sur Benjamin Wohlwend 2009-08-11 13:11:07

5 réponses

edit: veuillez cocher la deuxième réponse, il a une bien meilleure solution

EN code python, vous pouvez le faire pour convertir une date ou datetime à L'époque Unix

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

cela ne fonctionne pas dans un modèle Django cependant, donc vous avez besoin d'un filtre personnalisé, E. g:

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 ''
27
répondu Benjamin Wohlwend 2015-03-20 12:03:48

je sais qu'une autre réponse a été acceptée il y a un certain temps, mais cette question apparaît haut sur les résultats de recherche de Google, donc je vais ajouter une autre réponse.

Si vous travaillez au niveau du modèle, vous pouvez utiliser le U paramètredate filtre, par exemple:

{{ mydate|date:"U" }}

Notez qu'il sera basé sur le TIMEZONE dans votre settings.py.

100
répondu John Paulett 2012-06-11 14:24:31

et si vous n'êtes pas dans la couche template, vous pouvez toujours utiliser les mêmes utils django sous-jacents. Ex:

from django.utils.dateformat import format
print format(mymodel.mydatefield, 'U')
64
répondu Mike Fogel 2011-09-12 11:17:02

Dans votre views.py, vous pouvez convertir la valeur de mydate de secondes depuis l'époque Unix comme suit:

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

puis passez - le dans le dictionnaire que vous utilisez comme argument à render_to_response() (ou ce que vous utilisez pour rendre votre vue), et dans votre modèle, stick {{seconds}} dans un champ caché, que vous pouvez ensuite retirer du DOM pour passer à votre fonction javascript graph.

notez que a DateField cartes à l'objet Python datetime.date, et en tant que tel, son timetuple a ses heures, minutes et secondes champs à 0. Si ce n'est pas assez précis pour vous, vous aurez besoin de changer mydate à un champ DateTimeField et ce sera un datetime.datetime. Vous pouvez toujours utiliser mydate.timetuple() si vous faites cela.

de plus, je suppose que vous utilisez l'heure locale. Si vous utilisez l'heure UTC, vous voulez calendar.gmtime() plutôt que time.mktime() et mydate.utctimetuple() plutôt que mydate.timetuple(), mais utctimetuple() est seulement une méthode valide pour datetime.datetime objets. Voir le datetime docs (également time et calendar) pour plus délicats détails.

EDIT: délicats détails comme le fait que mktime() renvoie un char, dont piquadrat s'est souvenu et que je n'ai pas fait. L'approche sur mesure est également une bonne approche. Droit de vote.

6
répondu Meredith L. Patterson 2009-08-11 09:48:36

une autre option:

import time
from django.utils import timezone

naive_date = timezone.make_naive(mydate, timezone.get_current_timezone())
print int(time.mktime(naive_date.timetuple()))
1
répondu serg 2016-10-17 22:07:32