Наилучший способ обработать дату без внешних библиотек?

Есть список дат трёх типов:

9 июля 11:41
Вчера 23:13
Сегодня 09:43

Каков наиболее адекватный способ привести их к единому формату типа '07/08/2015 16:57:00'?

Мои идеи:
1) locale.setlocale(locale.LC_ALL, 'Russian_Russia.1251')
2) datetime.datetime.strptime('14 августа 13:22', "%d %B %H:%M" ) - заставить работать не удалось
3) Можно ли адекватно обработать 'Вчера/Сегодня' без использования парсинга, извращений с datetime.date.today() и timedelta?
4) Вот такие извращения лезут в голову:
def parse_date(text):
    return re.match(u'(?:(?P<yesterday>Вчера)|(?P<today>Сегодня)|(?P<day>\d{1,2})[ ](?P<month>[а-я]+))[ ](?P<time>\d{2}:\d{2})', text, flags=re.U)
  • Вопрос задан
  • 310 просмотров
Решения вопроса 2
@deliro
Агрессивное программирование
Наговнокодил тут для тебя :)
from datetime import date, datetime, timedelta

month_list = [None, 'янв', 'фев', 'мар', 'апр', 'мая', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек']

def get_month(s):
    for month in month_list[1:]:
        if month in s:
            return month_list.index(month)
    raise ValueError('Wrong month name %s' % s)

def parse_date(text):
    parts = text.lower().split()
    hours, mins = map(int, parts[-1].split(':'))
    if parts[0] in ('сегодня', 'вчера'):
        d = date.today() if parts[0] == 'сегодня' else date.today() - timedelta(1)
        return datetime(*d.timetuple()[:3] + (hours, mins))
    else:
        day, month, year = int(parts[0]), get_month(parts[1]), date.today().year
        return datetime(year, month, day, hours, mins)
Ответ написан
adugin
@adugin Автор вопроса, куратор тега Python
Я тут тоже наговнокодил. Вроде работает, но кровь из глаз не остановить:
# -*- coding: utf-8 -*-

import re
from datetime import datetime, timedelta

months = u'января февраля марта апреля мая июня июля августа сентября октября ноября декабря'.split()
regexp = u'(?:(?P<yesterday>Вчера)|(?P<today>Сегодня)|(?P<day>\d{1,2})[ ](?P<month>[а-я]+))[ ](?P<hour>\d{2}):(?P<minute>\d{2})'

def postdate(text, posted=None):
    if posted is None:
        posted = datetime.now()
    match = re.match(regexp, text, flags=re.U)
    if match:
        if match.group('today'):
            pass
        elif match.group('yesterday'):
            posted -= timedelta(days=1)
        else:
            posted = posted.replace(
                month = months.index(match.group('month')) + 1,
                day = int(match.group('day'))
            )
        posted = posted.replace(
            hour = int(match.group('hour')),
            minute = int(match.group('minute')),
            second = 0
        )
    return datetime.strftime(posted, "%d/%m/%Y %H:%M:%S")

print postdate(u'9 июля 11:41')
print postdate(u'Вчера 23:13')
print postdate(u'Сегодня 09:43')

Результат:
09/07/2015 11:41:00
06/08/2015 23:13:00
07/08/2015 09:43:00
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
AGIMA Москва
от 180 000 ₽
Level Travel Москва
До 160 000 ₽
СБК Москва
от 140 000 до 160 000 ₽
28 февр. 2020, в 16:23
20000 руб./за проект
28 февр. 2020, в 16:20
300 руб./за проект
28 февр. 2020, в 15:07
50000 руб./за проект