java.text.ParseException : Unparseable date : "..."

标签 java simpledateformat java-time dayofweek datetime-parsing

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

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 使用 uk 开箱即用地执行此操作。或 uk-UA语言环境。 编辑:令我惊讶的是,您的字符串使用的是 Java 认为的月份名称的独立形式(似乎我不明白月份名称的独立形式是什么意思)。要在格式中指定此表单,请使用 LLLL在格式模式字符串中而不是 MMMM .此外,字符串中星期五的名称与 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 会检查这一点,如果不是这样,它会反对。
    用乌克兰语写日期中的月份(适用于其他读者)
    在写这个答案之前,我对用乌克兰语写日期一无所知。对于好奇的读者,我想通过我的搜索传递一些观察结果。
    似乎使用了两种形式的月份名称:
  • 主格,Java 将其称为独立形式,例如 січень 表示一月。这种形式通常以 -ень (-en) 结尾。
  • Java 用作正常(非独立)形式的所有格,例如 січня 表示一月。也许“一月”可以用作翻译?这种形式通常以 -ня (-nya?)
  • 结尾

    在互联网上,我看到了日期中使用的两种形式。我不是很确定,但可能的趋势是: 主格(独立)形式用于一个月中没有某一天的情况,有时是非正式的;当月中的某一天出现时,正式使用所有格。
    链接
  • Java SE 8 Date and Time: Why do we need a new date and time library?
  • Oracle tutorial: Date Time解释如何使用 java.time。
  • How to Write Dates in Ukrainian + Useful Time Expressions (如果我理解正确,建议不要在日期中使用独立形式)
  • 关于java.text.ParseException : Unparseable date : "...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67028899/

    相关文章:

    java-8 - 年和年代有什么区别?

    java - 在时区中解析 DateTime

    java - 如何从正在运行的小程序获取信息?

    java - 创建数组的区别

    java - 如何定位谷歌地图标记?

    java - 空白面板 - 从另一个类加载面板时(在基类中创建的框架)

    java - 一年中一周的 Java 日期库不一致

    Java 将 GMT/UTC 转换为本地时间无法按预期工作

    java - 日期字符串的正确日期格式,例如 "2013-11-16T08:46:00.000-06:00"

    java - 为什么 java 8 时间没有向我显示时区 Etc/GMT+1 的正确时间