Синтаксический анализ Django dateutil изменяет дату на сегодняшнюю дату

#django #python-dateutil

#django #python-dateutil

Вопрос:

Я пытаюсь использовать Django dateutil.pareser.parse() для изменения даты ‘2016:09:24 17:08:45’ кому: «2016-09-24 17:08:45». Но когда я использую следующий код:

 the_timestamp = self.request.query_params.get('timestamp',0) # = '2016:09:24 17:08:45'
the_parsed_timestamp = dateutil.parser.parse(the_timestamp)
 

Я получаю результат the_parsed_timestamp = ‘2016-10-16 17:08:45’. 2016-10-16 это сегодняшняя дата.

Почему dateutil.parser.parse заменяет дату сегодняшней датой (и оставляет только временную часть)?

Комментарии:

1. Знаете ли вы, что это всегда в формате «%Y:%m:% d% H:%M: S»? Если это так, не используйте dateutil.parser , используйте datetime.strptime . Тем не менее, это похоже на ошибку, вы должны сообщить об этом в dateutil’s issue tracker — даже если этот формат не поддерживается, он не должен молча терпеть неудачу.

2. Кстати, я подозреваю, что происходит то, что он интерпретирует 2016:09:24 как %H:%M:%S , и способ dateutil работает, если вы дадите ему 2 триплета HMS подряд, второй перезапишет первый. Если вы передадите 2016:09:24 синтаксический анализатор сам по себе, он выдаст ошибку, потому что «2016» — это слишком большой час, поэтому вы фактически просто передаете это «17:08:45»

3. О, хорошо, значит, parse недостаточно умен для этого формата? Моя проблема в том, что я не уверен, в каком формате будет отображаться дата-время, поэтому я надеялся, что смогу использовать умную утилиту, такую как dateutil parse, чтобы разобраться в этом для меня. Есть ли предупреждение для dateutil?

4. @p Я пробовал strptime, как вы предлагаете, но получаю ошибку: ошибка значения: данные времени ‘2016:09:24 17:09:18’ не соответствует формату ‘%Y:%m:%d% H:%M: S’ Ах, хорошо, теперь я вижу опечатку 🙂

5. Я думаю, это просто ошибка в dateutil. Вы можете попробовать dateparser , но я не очень хорошо знаком с его общими возможностями. Очень сложно правильно проанализировать все, что когда-либо можно было бы считать датой, поэтому нестандартные форматы обычно не поддерживаются такого рода вещами, и в конечном итоге вам просто нужен специальный случай.

Ответ №1:

У вас неправильный формат даты. Это должно быть:

 2016-09-24
 

не

 2016:09:24
 

Комментарии:

1. Да, я знаю. Поступающая дата находится в формате 2016:09:24 Я пытаюсь использовать функцию анализа dateutil, чтобы преобразовать ее в правильный формат. Кажется, все в порядке, за исключением изменения даты!

2. @BillNoble Соответствует ли формат? Может быть, вы можете просто использовать datetime.datetime.strptime('2016:09:24 17:08:45', '%Y:%m:%d %H:%M:%S') вместо этого.

3. Это работает для данного конкретного случая, но формат даты не соответствует