"Будущий" год по умолчанию при преобразовании даты с помощью dateutil

Следующие шаблоны даты

1st January
30th April

легко разбираются на случаи datetime.date с помощью dateutil.parser.parse():

In [1]:from dateutil.parser import parse

In [2]: parse('1st January')
Out[2]: datetime.datetime(2012, 1, 1, 0, 0)

In [3]: parse('8th April')
Out[3]: datetime.datetime(2012, 4, 30, 0, 0)

Как можно вернуть будущую дату из разбора?

Т.е. разбор '1st January' вернется datetime.datetime(2013, 1, 1, 0, 0)1 января 2013 года, а не 1 января 2012 года. Любое элегантное решение?

1 ответ

Решение

Начиная с отличного ответа mensi на ваш предыдущий вопрос, вот решение, которое принимает даты без определенного года и гарантирует, что они не в прошлом. Если год указан как часть строки, он сохраняется без изменений.

import datetime
import dateutil

def parse(date_string):
    result = dateutil.parser.parse(date_string, default=datetime.datetime(1581, 1, 1))
    if result.year == 1581:
        now = datetime.datetime.now()
        result = result.replace(year=now.year)
        if result < now:
            result = result.replace(year=now.year + 1)
    return result

parse('8th April')
Другие вопросы по тегам