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
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 ''
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.
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')
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.
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()))