java.text.ParseException:无法解析的日期

java.text.ParseException: Unparsable Date

我在日志文件中有这个垃圾 DateFormat,需要解析以便比较它。

就是这样的格式。 Mon 03-Mai-21

我的尝试:

    DateFormat format = new SimpleDateFormat("EEE FF-MMM-YY", Locale.GERMAN);
    String test = "Mon 03-Mai-21";
    Date date = null;
    try {
        date = format.parse(test);
    } catch (ParseException e) {
        e.printStackTrace();
    }

我在尝试解析时收到 ParseException,但我不知道我的模式有什么问题?

我的预期结果是 2021-05-03。

java.time

我建议您使用 java.time,现代 Java 日期和时间 API,作为您的约会工作。

为您的格式声明格式化程序:

private static Map<Long, String> dayOfWeekAbbreviations
        = Map.ofEntries(
                Map.entry(1L, "Mon"),
                Map.entry(2L, "Die"),
                Map.entry(3L, "Mit"),
                Map.entry(4L, "Don"),
                Map.entry(5L, "Fre"),
                Map.entry(6L, "Sam"),
                Map.entry(7L, "Son"));

private static final DateTimeFormatter DATE_FORMATTER
        = new DateTimeFormatterBuilder()
                .appendText(ChronoField.DAY_OF_WEEK, dayOfWeekAbbreviations)
                .appendPattern(" dd-MMM-uu")
                .toFormatter(Locale.GERMAN);    

像这样解析:

    String test = "Mon 03-Mai-21";
    LocalDate date = LocalDate.parse(test, DATE_FORMATTER);
    System.out.println(date);

输出:

2021-05-03

Java 假设星期几缩写为 Mo.、Di.、Mi.、Do.、Fr.、Sa.、So。 (至少我的 Java 11 是这样;我认为有 Java 版本的缩写默认没有点)。由于 Montag(星期一)的缩写是 Mon,我们需要提供自己的缩写。这就是我通过地图所做的。我不知道你在一周的其他日子里得到了哪些缩写,所以请你自己将正确的缩写填入地图。

当然,另一种可能的解决方案是确保您获得的字符串使用 Java 的缩写。然后你可以像你的问题一样在你的格式模式字符串中使用 EEE ,这会使格式化程序更简单一些。

你的代码出了什么问题?

您的尝试存在三个问题:

  1. 正如我所说,格式模式字符串中的 EEE 需要两个字母的星期几缩写,例如 Mo.,因此不能接受 Mon。这导致了您看到的异常。
  2. FF 表示“一个月中的星期几”。所以你真的试图将你的字符串解析为 2021 年 5 月的第 3 个星期一,这就是为什么我问你是否预计 5 月 17 日。小写 dd 表示一个月中的第几天。
  3. 年份的大写 YY 是错误的。大写 Y 用于基于周的年份,仅对周数有用。对于年份,您需要小写 ySimpleDateFormat。对于 DateTimeFormatter,您可以使用 uy,对于第 1 年之前的年份具有不同的含义。

链接