我使用此代码收到此错误:
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.text.ParseException : Unparseable date : "...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67028899/