【问题标题】:Date validation and conversion to European format Python日期验证和转换为欧洲格式 Python
【发布时间】:2018-06-10 19:05:55
【问题描述】:

我正在尝试编写代码(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')

它仅在满足第一个“If”条件时才有效——在任何其他情况下都会崩溃,而不是检查所有 elif 条件。错误信息如下:

“ValueError:时间数据'05-30-1960'与格式'%Y-%m-%d'不匹配”

有人知道怎么处理吗?

【问题讨论】:

  • 而不是条件,try....except 并捕获转换错误

标签: python validation date datetime python-datetime


【解决方案1】:

您可以在一个函数中构建您的逻辑,以便在for 循环中按顺序尝试几种datetime 格式。然后在特定格式成功时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'

【讨论】:

  • 非常感谢!完美运行!
【解决方案2】:

如果你可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2012-08-05
    • 1970-01-01
    • 2020-05-24
    相关资源
    最近更新 更多