Dans un modèle, j'ai un tel champ: mydate = models.DateField ()
maintenant une fonction graphique javascript nécessite un horodatage unix tel que "1196550000000", comment puis-je retourner l'horodatage unix de mon entrée mydate.
Merci
modifier: veuillez vérifier la deuxième réponse, il a une bien meilleure solution
Dans le code python, vous pouvez le faire pour convertir une date ou une date/heure à l'époque Unix
import time
Epoch = int(time.mktime(mydate.timetuple())*1000)
Cela ne fonctionne pas dans un modèle Django cependant, vous avez donc besoin d'un filtre personnalisé, par exemple:
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 quelque temps, mais cette question apparaît en haut des résultats de recherche de Google, je vais donc ajouter une autre réponse.
Si vous travaillez au niveau du modèle, vous pouvez utiliser le paramètre U
pour le filtre date
, 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 modèle, vous pouvez toujours utiliser les mêmes utilitaires sous-jacents Django. Ex:
from Django.utils.dateformat import format
print format(mymodel.mydatefield, 'U')
Dans votre views.py
, Vous pouvez convertir la valeur de mydate
en secondes depuis l'époque Unix comme suit:
seconds = time.mktime(mydate.timetuple())
Ensuite, passez-le dans le dictionnaire que vous utilisez comme argument à render_to_response()
(ou tout ce que vous utilisez pour rendre votre vue), et dans votre modèle, collez {{seconds}}
Dans un champ caché que vous peut alors sortir du DOM pour passer à votre fonction graphique javascript.
Notez qu'un DateField
est mappé à Python objet datetime.date
, Et en tant que tel, son timetuple
aura ses champs heures, minutes et secondes mis à 0. Si ce n'est pas assez fin pour vous, vous devrez changer mydate
en DateTimeField et ce sera un datetime.datetime
. Vous pouvez toujours utiliser mydate.timetuple()
Si tu fais ça.
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()
n'est qu'un méthode valide pour les objets datetime.datetime
. Voir les documents datetime
(également time
et calendar
) pour plus de détails.
EDIT: des détails délicats tels que le fait que mktime()
renvoie un flottant, dont piquadrat s'est souvenu et je ne l'ai pas fait. L'approche du filtre personnalisé est également bonne. Voter celui-là.
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()))