web-dev-qa-db-fra.com

django Datefield to Unix timestamp

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

35
Hellnar

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 ''
28
Benjamin Wohlwend

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.

103
John Paulett

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')
67
Mike Fogel

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à.

6

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
serg