如果我提供可选的月份和日期,如何将字符串转换为有效的日期格式
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)));
}
输出:
2021-12-20
2021-12-01
2021-01-01
2021-01-01
(我必须承认@YCF_L 解决方案更优雅)
我想将我的字符串转换为有效的日期格式,即使月份和日期是可选的
例如,我有如下字符串
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)));
}
输出:
2021-12-20
2021-12-01
2021-01-01
2021-01-01
(我必须承认@YCF_L 解决方案更优雅)