Подтвердить что ты не робот

Разбор строки Datetime в Django DateTimeField

У меня есть приложение Django с моделью, которая содержит поле типа DateTimeField.
Я извлекаю данные из Интернета в формате 2008-04-10 11:47:58-05.
Я считаю, что последние 3 символа в этом примере являются часовым поясом.
Как сохранить эти данные в DateTimeField, и есть ли легкое преобразование между ними? Установка DateTimeField, чтобы просто содержать строку из вышеприведенного формата, вызывает значение ValidationError.

Спасибо!

4b9b3361

Ответ 1

Вы можете использовать

import dateutil.parser
dateutil.parser.parse('2008-04-10 11:47:58-05')

Что возвращает дата-время (которое может быть присвоено DateTimeField).

Ответ 2

Вы также можете использовать реализацию Django. Я бы предпочел это и использовал только что-то другое, если парсер Django не может обрабатывать формат.

Например:

>>> from django.utils.dateparse import parse_datetime
>>> parse_datetime('2016-10-03T19:00:00')
datetime.datetime(2016, 10, 3, 19, 0)
>>> parse_datetime('2016-10-03T19:00:00+0200')
datetime.datetime(2016, 10, 3, 19, 0, tzinfo=<django.utils.timezone.FixedOffset object at 0x8072546d8>)

Чтобы преобразовать его в нужную часовую зону, когда никто не известен, используйте make_aware от django.utils.timezone.

Таким образом, ваша утилита анализатора будет выглядеть следующим образом:

from django.utils.dateparse import parse_datetime
from django.utils.timezone import is_aware, make_aware

def get_aware_datetime(date_str):
    ret = parse_datetime(date_str)
    if not is_aware(ret):
        ret = make_aware(ret)
    return ret

Ответ 3

Я использовал это:

from django.utils.timezone import get_current_timezone
from datetime import datetime
tz = get_current_timezone()
dt = tz.localize(datetime.strptime(str_date, '%m/%d/%Y'))

Ответ 4

Если вы используете Django Forms, вы можете указать input_formats на DateField. См. Документация DateField

Если вы хотите разобрать произвольную дату, вы можете использовать что-то вроде parsedatetime и реализовать метод, который вызывает Django синтаксический анализ до того, как он попадет на валидаторы. (См. этот SO ответ для хорошего резюме того, как работают валидации и когда их вставлять)