[英]How to convert string into valid date format if I provide month and days as optional
我想将我的字符串转换为有效的日期格式,即使月份和日期是可选的
例如,我有以下字符串,如下所示
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"
你能帮我解决这个问题吗? 任何信息都会非常有帮助。 我无法定义为解析器格式化的单个字符串,因为字符串格式在我的场景中是不可预测的。
您可以将DateTimeFormatterBuilder
与多个模式和缺失部分的默认值(月和日)一起使用:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("[dd-MM-uuuu]")
.appendPattern("[MM-uuuu]")
.appendPattern("[uuuu]")
.appendPattern("[uu]")
.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
.toFormatter();
输出
2021-12-20
2021-12-01
2021-01-01
2021-01-01
在您的特殊情况下,一个古怪但有效的解决方案如下:
public class DateParser {
private static String defaultDate = "01-01-2000";
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
public static LocalDate parseDate(String date) {
String fullDate = defaultDate.substring(0, defaultDate.length() - date.length()) + date;
return LocalDate.parse(fullDate, formatter);
}
}
基本上,使用默认的完整日期,例如01-01-2000
,然后将其与输入日期结合。 然后,使用格式化程序dd-MM-yyyy
来解析日期。 优点之一是它重用了相同的格式化程序,因此非常有效。 但是,您可能需要添加一些检查和异常处理。
要测试它:
public static void main(String[] args) {
List.of(
"20-12-2021",
"12-2021",
"2021",
"21"
).forEach(date -> System.out.println(parseDate(date)));
}
Output:
2021-12-20
2021-12-01
2021-01-01
2021-01-01
(我必须承认@YCF_L 解决方案更优雅)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.