Разбор строки даты и времени в Django DateTimeField - PullRequest
28 голосов
/ 26 декабря 2011

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

Спасибо!

Ответы [ 5 ]

65 голосов
/ 15 июня 2014

Вы также можете использовать реализацию 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
40 голосов
/ 26 декабря 2011

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

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

, который возвращает дату и время (которые могут быть назначены для DateTimeField).

10 голосов
/ 14 июля 2014

Я использую это:

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'))
3 голосов
/ 26 декабря 2011

Если вы используете формы Django, вы можете указать input_formats для вашего DateField.См. Документацию DateField

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

0 голосов
/ 19 марта 2019

Формат строки Django DateTimeField: «% Y-% m-% dT% H:% M:% S.% fZ». Следовательно, преобразование между ними может быть выполнено с использованием strptime () или strptime () с использованием этого формата.

например. для строкового значения (2016-10-03T19: 00: 00.999Z) его можно преобразовать к объекту даты и времени Django как:

from datetime import datetime

datetime_str = '2016-10-03T19:00:00.999Z'

datetime_object = datetime.strptime(datetime_str, "%Y-%m-%dT%H:%M:%S.%fZ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...