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

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 解决方案更优雅)