繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM