繁体   English   中英

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 日期和时间 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 版本,默认情况下缩写不带点)。 由于您的缩写是Mon代表Montag (星期一),我们需要提供我们自己的缩写。 这就是我通过地图所做的。 我不知道你在一周中的其他几天得到哪些缩写,所以请自己在地图中填写正确的缩写。

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

你的代码出了什么问题?

您的尝试存在三个问题:

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

链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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