django Datefield в временную метку Unix

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

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

Спасибо


person Community    schedule 11.08.2009    source источник
comment
1196550000000 не является отметкой времени unix, если только мы не говорим о 37 942 году или что-то в этом роде.   -  person    schedule 12.08.2009
comment
Это похоже на отметку времени JavaScript, мс с эпохи Unix.   -  person 0atman    schedule 26.05.2011


Ответы (6)


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

В коде 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 ''
person Benjamin Wohlwend    schedule 11.08.2009
comment
что я не понимаю: почему бы не использовать метод strftime() класса даты и полностью избавиться от модуля времени? - person ; 12.08.2009
comment
hop: strftime() возвращает строку, а это не всегда то, что вам нужно. - person Timmmm; 27.09.2012
comment
@Pykler, если вы хотите отредактировать ответ, чтобы исправить неверное утверждение, продолжайте, но ваше редактирование действительно должно удалить неправильное утверждение и заменить его правильным. В противном случае ваше редактирование не лучше, чем комментарий, который нужно прочитать постфактум. Нет необходимости сохранять исходный ответ в первозданном виде или специально выделять обновленные части, потому что у каждого сообщения есть история редактирования, где мы можем увидеть старые версии, если кому-то достаточно любопытно, чтобы посмотреть. - person Rob Kennedy; 21.09.2013

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

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

{{ mydate|date:"U" }}

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

person John Paulett    schedule 31.07.2010
comment
Поскольку это решение настолько низкое, что нет голосов, я подумал, что упомяну, что оно сработало для меня без каких-либо проблем. Спасибо. - person michaelavila; 14.03.2011
comment
У меня проблемы с запуском. Я могу получить дату и время для вывода, используя любой другой набор флагов, но когда я пытаюсь использовать флаг U, я получаю пустую строку. Я запутался. - person Nicholas Flynt; 25.03.2011
comment
В качестве примечания: обычно лучше хранить метки времени в БД вместо строк даты. Временные метки являются абсолютными (всегда в формате UTC) и представляют собой целое число, которым легко манипулировать. - person AJJ; 11.07.2011
comment
По-видимому, это основано не на часовом поясе, а на UTC. Чтобы процитировать документы Django: 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')
person Mike Fogel    schedule 12.09.2011
comment
Для справки: github.com/django/django/blob/master /django/utils/dateformat.py - person Paolo; 03.12.2012
comment
Прочитав ответ выше, я искал именно это. - person Petr Peller; 23.04.2014

В вашем 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() возвращает число с плавающей запятой, которое помнил пиквадрат, а я нет. Подход с пользовательским фильтром также хорош. Голосование за это.

person Meredith L. Patterson    schedule 11.08.2009

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

import time
from django.utils import timezone

naive_date = timezone.make_naive(mydate, timezone.get_current_timezone())
print int(time.mktime(naive_date.timetuple()))
person serg    schedule 17.10.2016

Очень простой способ, который я не нашел в ответах

import time
timestamp = int(time.time())
person Oleg Shleif    schedule 06.06.2020
comment
При добавлении ответа на вопрос десятилетней давности с пятью существующими ответами очень важно указать, к какому новому аспекту вопроса относится ваш ответ. Ответы только на код почти всегда можно улучшить, добавив объяснение того, как и почему они работают. - person Jason Aller; 07.06.2020