Преобразовать строку относительной даты в абсолютную дату - PullRequest
3 голосов
/ 06 января 2011

В качестве ввода у меня есть строка даты, которая может принимать три основных формата:

a) 6 января 2011 г. b) 4 дня назад c) 12 часов назад

Я хочу сценарийчтобы иметь возможность распознавать формат и вызывать соответствующую функцию с параметрами.

Так что если затем convert_full_string ("6 января 2011")

если b, то convert_days (4)

если c, то convert_hours (12)

Как только я узнаю формат и смогу вызвать соответствующую функцию, это будет относительно легко.Я планирую использовать dateutil

Но я не уверен, как распознать формат.

Любые предложения с примерами кода приветствуются.

Ответы [ 3 ]

12 голосов
/ 06 января 2011

Используя parsedatetime , вы можете разбить все три формата даты на datetime.datetime объекты без необходимости кодировать логику самостоятельно:

import parsedatetime.parsedatetime as pdt
import parsedatetime.parsedatetime_consts as pdc
import datetime
c = pdc.Constants()
p = pdt.Calendar(c)
for text in ('january 6, 2011', '4 days ago', '12 hours ago'):
    date=datetime.datetime(*p.parse(text)[0][:6])
    # print(date.isoformat())
    # 2011-01-06T09:00:18
    # 2011-01-02T09:00:18
    # 2011-01-05T21:00:18
    print(date.strftime('%Y%m%dT%H%M%S'))
    # 20110106T090208
    # 20110102T090208
    # 20110105T210208
0 голосов
/ 06 января 2011
if 'days' in userinput: 
    convert_days(userinput[:userinput.index('days')].strip())
elif 'hours' in userinput:
    convert_hours(userinput[:userinput.index('hours')].strip())
else:
    convert_full_string(userinput)

Предполагается, что когда в userinput содержатся «дни» или «часы», вы всегда хотите использовать символы, которые идут непосредственно перед этими двумя словами.

0 голосов
/ 06 января 2011

Можно сопоставить с регулярными выражениями:

import re
re.search(r".* [0-9]{1,2}, [0-9]{4}", tomatch)

Аналогично [0-9]{1,2} дня назад и т. Д.

...