如何使用解析器正确解析信用卡到期日期格式?

问题描述 投票:0回答:1

我正在使用 dateutil python 包中的解析器,它对于大多数日期都工作正常,但有很多地方它是随机工作的。一个例子是:在日期字符串

5/23
中,我试图表示 2023 年 5 月。但解析器将其解析为
2024-05-23 00:00:00
。正如你所看到的,它以 23 作为日期,以 5 作为月份(这是正确的),并且它包括年份
2024
,我猜是因为那是当前年份。我怎样才能强制我的解析器不这样做?

我注意到的事情 我知道,如果我给出 4 位数的年份,它不会采用默认的当前年份,因此该值会被正确解析,如

06/2025
。我尝试查看解析器库的文档,但没有找到任何有用的东西。

我注意到的另一个奇怪的事情是对于像

5/86
这样的日期,我猜它需要1900,因为它更接近?所以
5/86
被解析为
1986-05-30 00:00:00
。有什么选择可以阻止这种情况并且只在未来获取值吗?因为对于信用卡来说,我们不能有过去的到期日期。我知道我们不会拥有 80 年后到期的信用卡,但我的代码明确要求我们不能获得过去的日期。

我注意到的另一个奇怪的事情是对于像

5/86
这样的日期,我猜它需要1900,因为它更接近?所以
5/86
被解析为
1986-05-30 00:00:00
。有什么选择可以阻止这种情况并且只在未来获取值吗?因为对于信用卡来说,我们不能有过去的到期日期。我知道我们不会拥有 80 年后到期的信用卡,但我的代码明确要求我们不能获得过去的日期。

我的代码:

from dateutil import parser
from datetime import datetime


def date_string_to_datetime_conversion(date_string: str):
    try:
        return parser.parse(date_string, dayfirst=True)
    except (ValueError, TypeError) as e:
        try:
            return parser.parse(date_string)
        except (ValueError, TypeError) as e:
            raise InvalidData(
                f"The expiration_date is a required column in a bankcard and must be in a valid date format. "
                f"Additional info {e}"
            )
            

date_string_list = ['05/23','6/2025','12/12','12/31','5/86','4/32']
# 2024-05-23 00:00:00
# 2025-06-30 00:00:00
# 2024-12-12 00:00:00
# 2024-12-31 00:00:00
# 1986-05-30 00:00:00
# 2032-04-30 00:00:00


for date_time in date_string_list:
    print(date_string_to_datetime_conversion(date_time))
python python-3.x datetime validation parsing
1个回答
0
投票

从技术上来说,创建只有一个月和一年的日期对象是不可能的,所以我建议您任意选择,例如该月的第一天。以下代码应该能够按照您的描述解析日期:

from datetime import datetime

def parse_date(date_str):
    month, year = date_str.split("/")
    month = int(month)
    year = int(year)
    if year < 2024:
        year = 2000 + year
    try:
        return datetime(year, month, 1)
    except:
        print("Invalid date passed.")
© www.soinside.com 2019 - 2024. All rights reserved.