以下是我的代码。目标是将日期输入转换为虚线格式(例如01-01-2001)。转换日期后,应打印日期。但是,如果日期难以理解或不是有效输入,则应打印"不是有效日期"并返回无。现在,即使是正确的日期输入,它也只返回None。转换脚本在之前的任务中使用并且运行正常,因此我确实认为问题出在' try / except'块。
测试输入:
print(date_conversion_robust('19/8/16'))---> 19-08-2016
print(date_conversion_robust('1/12/1898'))---> 01-12-1898
print(date_conversion_robust('16/3/18'))---> 16-03-1918
print(date_conversion_robust('29/2/2017'))---> Not a valid date. None
print(date_conversion_robust('131/2/1928'))---> Not a valid date. None
print(date_conversion_robust(2))---> Not a valid date. None
谢谢!
#Convert date inputs
def convert_day(day_string):
if int(day_string) < 10:
return (day_string).zfill(2)
else:
return day_string
def convert_month(month_string):
if int(month_string) < 10:
return (month_string).zfill(2)
else:
return month_string
def convert_year(year_string):
if int(year_string) < 18:
return('20'+(year_string))
elif int(year_string) < 99:
if int(year_string) >= 18:
return('19'+(year_string))
else:
return year_string
#form date string
def date_conversion(date_string):
date_as_list = date_string.split('/')
a = convert_day(date_as_list[0])
b = convert_month(date_as_list[1])
c = convert_year(date_as_list[2])
try:
L = [a, b, c]
return('-'.join(L))
except(AttributeError, SyntaxError, TypeError):
print('Not a valid date.')
return None
答案 0 :(得分:0)
Python具有标准库中包含的日期解析和日期格式化功能。为什么不直接使用它们?
import datetime
def date_conversion(date_string):
try:
dt = datetime.datetime.strptime(date_string, '%d/%m/%y')
except ValueError: # invalid input string
return None
if dt.year >= 2018:
dt = dt.replace(year=dt.year - 100) # change century
return dt.strftime('%d-%m-%Y')
通过使用此功能,您还可以确保拒绝非实际日期(例如35/01/78)的输入。
此处记录了datetime格式字符串的用法:https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
答案 1 :(得分:0)
您正在采取一些额外步骤,并且您正在跳过一些步骤。验证日期和/或处理不同的日期格式是棘手的部分,而您却没有这样做:分隔符/
,-
,.
?它是dd-mm-yyyy还是mm-dd-yyyy或其他无数格式之一? (如果您从具有已知格式的来源中拉出来可能不是问题,但如果您期望人类日期输入肯定会出现问题)。您的组件转换功能不必有条件地调用.zfill()
,即'12'.zfill(2)
不是错误 - 这意味着您根本不需要此功能。你的尝试/除了似乎是错误的:它应该真正围绕验证输入,一旦你有三个元素,它不会失败加入他们创建回报。您可以轻松使用字符串格式。等等。
如上所述,使用模块进行日期操作似乎是要走的路!
答案 2 :(得分:0)
除了工作之外,它应该是
except ValueError:
而不是
except(AttributeError, SyntaxError, TypeError):
以下功能应该可以正常工作:
# Convert date inputs
def convert_day(day_string):
if int(day_string) < 10:
return (day_string).zfill(2)
else:
return day_string
def convert_month(month_string):
if int(month_string) < 10:
return (month_string).zfill(2)
else:
return month_string
def convert_year(year_string):
if int(year_string) < 18:
return('20'+(year_string))
elif int(year_string) < 99:
if int(year_string) >= 18:
return('19'+(year_string))
else:
return year_string
# form date string
def date_conversion(date_string):
try:
date_as_list = date_string.split('/')
a = convert_day(date_as_list[0])
b = convert_month(date_as_list[1])
c = convert_year(date_as_list[2])
k = a + '-' + b + '-' + c
print(k)
except ValueError:
print('Not a valid date.')
# return None
# 2 Test cases
date_conversion('19/8/16')
date_conversion('asfsdfggdf')
上面代码的结果将是
19-08-2016
Not a valid date.
Process finished with exit code 0