В модели у меня есть такое поле: mydate = models.DateField()
теперь для функции графика javascript требуется временная метка unix, такая как «1196550000000», как я могу вернуть временную метку unix моего ввода mydate.
Спасибо
В модели у меня есть такое поле: mydate = models.DateField()
теперь для функции графика javascript требуется временная метка unix, такая как «1196550000000», как я могу вернуть временную метку unix моего ввода mydate.
Спасибо
редактировать: пожалуйста, проверьте второй ответ, у него гораздо лучшее решение
В коде 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 ''
strftime()
возвращает строку, а это не всегда то, что вам нужно.
- person Timmmm; 27.09.2012
Я знаю, что некоторое время назад был принят другой ответ, но этот вопрос занимает первое место в результатах поиска Google, поэтому я добавлю еще один ответ.
Если вы работаете на уровне шаблона, вы можете использовать ссылку U
параметр для фильтра date
, например:
{{ mydate|date:"U" }}
Обратите внимание, что он будет основан на TIMEZONE
в вашем файле settings.py.
Seconds since the Unix Epoch (January 1 1970 00:00:00 UTC)
. Это также правильный способ, поскольку временные метки Unix определяются как секунды с 1970 UTC.
- person Danilo Bargen; 13.10.2014
И если вы не находитесь на уровне шаблона, вы все равно можете использовать те же базовые утилиты django. Бывший:
from django.utils.dateformat import format
print format(mymodel.mydatefield, 'U')
В вашем 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()
возвращает число с плавающей запятой, которое помнил пиквадрат, а я нет. Подход с пользовательским фильтром также хорош. Голосование за это.
Другой вариант:
import time
from django.utils import timezone
naive_date = timezone.make_naive(mydate, timezone.get_current_timezone())
print int(time.mktime(naive_date.timetuple()))
Очень простой способ, который я не нашел в ответах
import time
timestamp = int(time.time())