Django Datefield в Unix отметка времени - PullRequest
33 голосов
/ 11 августа 2009

В модели у меня есть такое поле: mydate = models.DateField ()

теперь для функции javascript graph требуется метка времени Unix, например «1196550000000», как я могу вернуть метку времени Unix для ввода mydate.

Спасибо

Ответы [ 5 ]

101 голосов
/ 31 июля 2010

Я знаю, что еще один ответ был принят некоторое время назад, но этот вопрос показывается в результатах поиска Google, поэтому я добавлю еще один ответ.

Если вы работаете на уровне шаблона, вы можете использовать параметр U для фильтра date, например ::

{{ mydate|date:"U" }}

Обратите внимание, что он будет основан на TIMEZONE в вашем файле settings.py.

65 голосов
/ 12 сентября 2011

И если вы не находитесь на уровне шаблона, вы все равно можете использовать те же базовые утилиты django. Пример:

from django.utils.dateformat import format
print format(mymodel.mydatefield, 'U')
27 голосов
/ 11 августа 2009

изменить: пожалуйста, проверьте второй ответ, у него есть намного лучшее решение

В коде Python вы можете сделать это, чтобы преобразовать дату или дату и время в эпоху Unix

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

Это не работает в шаблоне Django, поэтому вам нужен собственный фильтр, например:

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 ''
6 голосов
/ 11 августа 2009

В вашем views.py вы можете преобразовать значение mydate в секунды, начиная с эпохи Unix, следующим образом:

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

Затем передайте его в словаре, который вы используете в качестве аргумента, render_to_response() (или тому, что вы используете для визуализации своего представления), а в своем шаблоне введите {{seconds}} в скрытое поле, которое вы можете затем нажать из DOM, чтобы перейти к функции графа JavaScript.

Обратите внимание, что DateField отображается на объект Python datetime.date, и поэтому его timetuple будет иметь свои поля часов, минут и секунд равными 0. Если этого недостаточно для вас, вы Вам нужно будет изменить mydate на DateTimeField, и это будет datetime.datetime. Вы все еще можете использовать mydate.timetuple(), если вы делаете это.

Кроме того, я предполагаю, что вы используете местное время. Если вы используете время UTC, вам нужно calendar.gmtime() вместо time.mktime() и mydate.utctimetuple() вместо mydate.timetuple(), но utctimetuple() является допустимым методом только для datetime.datetime объектов. См. datetime документы (также time и calendar) для более подробной информации.

РЕДАКТИРОВАТЬ: поразительные детали, такие как факт, что mktime() возвращает число с плавающей запятой, о котором Пиквадрат вспомнил, а я нет. Подход с пользовательским фильтром также хорош. Голосование за это.

1 голос
/ 18 октября 2016

Другой вариант:

import time
from django.utils import timezone

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