我正在使用 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))
从技术上来说,创建只有一个月和一年的日期对象是不可能的,所以我建议您任意选择,例如该月的第一天。以下代码应该能够按照您的描述解析日期:
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.")