Проверка даты и преобразование в европейский формат Python - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь написать код (Python), который проверял бы формат даты ввода и затем преобразовывал его в DD-MM-YYYY (если формат ввода отличается от DD-MM-YYYY).Я проверил похожие вопросы в StackOverflow, но все они связаны с проверкой или преобразованием формата, и я понятия не имею, как сделать оба одновременно.Я не могу заблокировать ввод в других форматах, так как он поступает из внешнего источника.

Пока я написал это:

import datetime
YearOfBirthString = '05-30-1960'
if YearOfBirthString != '':
    if datetime.datetime.strptime(YearOfBirthString, '%d-%m-%Y'):
        print(YearOfBirthString)
    elif datetime.datetime.strptime(YearOfBirthString, '%Y-%m-%d'):
        correctDate = datetime.datetime.strptime(YearOfBirthString, '%Y-%m-%d').strftime('%d-%m-%Y')
        print(correctDate)
    elif datetime.datetime.strptime(YearOfBirthString, '%m-%d-%Y'):
        correctDate = datetime.datetime.strptime(YearOfBirthString, '%m-%d-%Y').strftime('%d-%m-%Y')
        print(correctDate)
    elif datetime.datetime.strptime(YearOfBirthString, '%Y-%d-%m'):
        correctDate = datetime.datetime.strptime(YearOfBirthString, '%Y-%d-%m').strftime('%d-%m-%Y')
        print(correctDate)
    else:
        print('Nuffin')
else:
    print('Nuffin')

Он работает только тогда, когда выполняется первое условие «Если»,вылетает в любых других случаях вместо проверки всех условий elif.Сообщение об ошибке выглядит следующим образом:

«Ошибка значения: данные времени« 05-30-3060 »не соответствуют формату«% Y-% m-% d »»

Кто-нибудь знает, как с этим бороться?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Вы можете структурировать свою логику в функции для последовательной попытки нескольких форматов datetime в цикле for.Затем return при успешном выполнении определенного формата.

Это решение использует только datetime из стандартной библиотеки и try / except для захвата неудачных попыток.

from datetime import datetime

YearOfBirthString = '05-30-1960'

def converter(s, format_list, format_output):
    for date_format in format_list:
        try:
            return datetime.strptime(s, date_format).strftime(format_output)
        except ValueError:
            continue      
    return 'Nuffin'

res = converter(YearOfBirthString,
                format_list=['%d-%m-%Y', '%Y-%m-%d', '%m-%d-%Y', '%Y-%d-%m'],
                format_output='%d-%m-%Y')

# '30-05-1960'
0 голосов
/ 10 июня 2018

Если вы можете использовать dateutil .

Демо:

from dateutil.parser import parse
import datetime
YearOfBirthString = ['05-30-1960', '1960-05-30', '30-05-1960', '1960-30-05']
for date in YearOfBirthString:
    try:
        print( parse(date).strftime('%d-%m-%Y') )
    except:
        cDate = datetime.datetime.strptime(date, '%Y-%d-%m').strftime('%d-%m-%Y')
        print( cDate )

Выход:

30-05-1960
30-05-1960
30-05-1960
30-05-1960
...