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

我使用此代码收到此错误:

SimpleDateFormat sdf = new SimpleDateFormat("EEEE dd MMMM HH:mm yyyy",myDateFormatSymbols);
sdf.parse("????????? 12 ??????? 07:00 2021");


"Monday 12 April 07:00 2021"。问题是,每当我将日期从星期一更改为星期二 ( "????????") 时,我都不会收到此错误,并且代码有效。这是代码myDateFormatSymbols

private final static DateFormatSymbols myDateFormatSymbols = new DateFormatSymbols(){
        @Override
        public String[] getWeekdays(){
             return new String[]{"?????????","????????", "??????", "??????", "???????", "??????", "??????"};
        }
        @Override
        public String[] getMonths() {
            return new String[]{...};
        }
}

所有月份和工作日都正常工作,似乎这个错误只发生在星期一。

回答

  • 时间

  • 月份名称的独立形式

  • DateTimeFormatterBuilder.appendText(TemporalField, Map<Long, String>)

我强烈建议您使用java.time,现代 Java 日期和时间 API(底部的链接)来处理您的日期和时间工作。

您正在尝试用乌克兰语解析日期时间字符串。我们会立即期望 Java 使用ukuk-UAlocale开箱即用地执行此操作。编辑:令我惊讶的是,您的字符串使用的是 Java 认为的月份名称的独立形式(似乎我不明白月份名称的独立形式是什么意思)。要在格式中使用LLLL格式模式字符串而不是MMMM. 此外,字符串中 Friday 的名称与 Java 知道的名称不同(带有撇号的????????,正如 Basil Bourque 已经说过的,来自 CLDR)。正如您已经尝试过的那样,解决方案是指定您自己的日子名称。在 java.time 这是通过一个DateTimeFormatterBuilder及其双参数appendText方法。例如:

private static final Map<Long, String> DAY_NAMES = Map.of(1L, "?????????", 2L, "????????",
        3L, "??????", 4L, "??????", 5L, "???????", 6L, "??????", 7L, "??????");
private static final Locale UKRAINIAN = Locale.forLanguageTag("uk-UA");
private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
        .appendText(ChronoField.DAY_OF_WEEK, DAY_NAMES)
        .appendPattern(" dd LLLL HH:mm uuuu")
        .toFormatter(UKRAINIAN);

现在格式化程序就位,解析很简单,因为它应该是:

    String stringToParse = "????????? 12 ??????? 07:00 2021";
    LocalDateTime dateTime = LocalDateTime.parse(stringToParse, FORMATTER);
    System.out.println(dateTime);

输出:

2021-04-12T07:00

我发现我的代码比你的更清晰易读,这对代码来说很重要。没有有趣的覆盖。从 0 开始没有疯狂的月份编号。星期一是一周的第一天,因为它在您的问题和乌克兰中都是如此。

默认情况下,java.time 也会执行更好的验证。当您的字符串表示 4 月 12 日是星期一时,java.time 会检查这一点,如果不是这样,它会反对。

用乌克兰语写日期中的月份(适用于其他读者)

在写这个答案之前,我对用乌克兰语写日期一无所知。对于好奇的读者,我想通过我的搜索传递一些观察结果。

似乎使用了两种形式的月份名称:

  1. 主格,Java 称为独立形式,例如?????? 一月。这种形式通常以-??? ( -en )。
  2. Java 用作正常(非独立)形式的所有格,例如????? 一月。也许“一月”可以用作翻译?这种形式通常以-?? - 是吗?)

在互联网上,我看到了日期中使用的两种形式。我不是很确定,但可能的趋势是: 主格(独立)形式用于一个月中没有某一天的情况,有时是非正式的;当月中的某一天出现时,正式使用所有格。

链接

  • Java SE 8 日期和时间:为什么我们需要一个新的日期和时间库?
  • Oracle 教程:解释如何使用 java.time 的日期时间。
  • 如何用乌克兰语写日期 + 有用的时间表达式(如果我理解正确,建议不要在日期中使用独立形式)

以上是java.text.ParseException:无法解析的日期:“…”的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>