Java 如果我提供月和日作为可选项,如何将字符串转换为有效的日期格式

Java 如果我提供月和日作为可选项,如何将字符串转换为有效的日期格式,java,date,java-time,Java,Date,Java Time,我想将字符串转换为有效的日期格式,即使月份和日期是可选的 例如,我有如下字符串 String date1 = "20-12-2021" String date2 = "12-2021" i.e without day String date3 = "2021" i.e without day & month String date4 = "21" i.e without day, month & ju

我想将字符串转换为有效的日期格式,即使月份和日期是可选的

例如,我有如下字符串

String date1 = "20-12-2021"
String date2 = "12-2021" i.e without day
String date3 = "2021" i.e without day & month
String date4 = "21" i.e without day, month & just last two digits of the year
我想将上述所有字符串格式转换为有效日期,格式为“yyyy mm dd”,如下所示

For date1, Date should be "2021-12-20" 
For date2, Date should be "2021-12-01"
For date3, Date should be "2021-01-01" 
For date4, Date should be "2021-01-01"
你能帮我做这个吗?任何信息都会非常有用。我无法为解析器定义单个字符串格式,因为在我的场景中字符串格式是不可预测的。

您可以使用多个模式和缺少部分的默认值(月和日):

输出

2021-12-20
2021-12-01
2021-01-01
2021-01-01

在您的特殊情况下,一个古怪但有效的解决方案如下:

公共类日期分析器{
私有静态字符串defaultDate=“01-01-2000”;
私有静态最终DateTimeFormatter格式化程序=模式的DateTimeFormatter.of(“dd-MM-yyyy”);
公共静态LocalDate parseDate(字符串日期){
字符串fullDate=defaultDate.substring(0,defaultDate.length()-date.length())+date;
返回LocalDate.parse(fullDate,格式化程序);
}
}
基本上,使用默认的完整日期,例如
01-01-2000
,然后将其与输入日期组合。然后,使用格式化程序
dd-MM-yyyy
解析日期。优点之一是它重用相同的格式化程序,因此非常有效。但是,您可能需要添加一些检查和异常处理

要测试它,请执行以下操作:

publicstaticvoidmain(字符串[]args){
名单(
"20-12-2021",
"12-2021",
"2021",
"21"
).forEach(日期->系统输出.println(解析日期(日期));
}
输出:

2021-12-20
2021-12-01
2021-01-01
2021-01-01

(我必须承认@YCF_L solution更优雅)

如果您的输入仅为“21”,您如何知道需要添加哪个世纪、月份和日期?如果我的输入仅为“21”,则我应将默认年份设置为20世纪。如果我没有提供月和日,那么我的月和日应该总是指向01&01。希望这个信息是清楚的@萨拉瓦纳库玛我猜你指的是21世纪(从2001年到2100年)@FedericoklezCulloca是的,打字错误。实际上,我是想提到21世纪。我将在我的comment@saravanakumar恐怕太晚了。最好删除它,然后重新编写。然后,当你完成标记我的评论为“不再需要”,这样他们将被删除
2021-12-20
2021-12-01
2021-01-01
2021-01-01