Я использовал parsedatetime , и он работал довольно хорошо для меня. На домашней странице перечислены некоторые форматы, которые он может обрабатывать, например ::100100
- за 5 минут
- через 5 минут
- 2 часа до полудня
- 2 дня с завтрашнего дня
Основным недостатком, который я обнаружил, является отсутствие часовых поясов.
На случай, если оно того стоит, я использую функцию-оболочку, которая всегда возвращает объект datetime
независимо от того, является ли входная строка относительной (как все ваши примеры) или фиксированной:
def parse_datetime(datetime_string):
datetime_parser = parsedatetime.Calendar(parsedatetime_consts.Constants())
timestamp = datetime_parser.parse(datetime_string)
if len(timestamp) == 2:
if timestamp[1] == 0:
raise ValueError(u'Failed to parse datetime: %s' % datetime_string)
timestamp = timestamp[0]
return datetime.fromtimestamp(time.mktime(timestamp))