无法解析,FomatStyle

Unable to parse, FomatStyle

在我的应用程序中,当我 select '20:45' 到 TimePicker 时,它的格式类似于 '8:45 pm' 我可以使用以下代码重现该问题:

String input = "8:45pm";
LocalTimeStringConverter converter = new LocalTimeStringConverter(FormatStyle.SHORT, Locale.ENGLISH);
System.out.println(converter.fromString(input));

抛出异常:

java.time.format.DateTimeParseException: Text '8:45pm' could not be parsed at index 4
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1777)
at javafx.util.converter.LocalDateTimeStringConverter$LdtConverter.fromString(LocalDateTimeStringConverter.java:208)
at javafx.util.converter.LocalTimeStringConverter.fromString(LocalTimeStringConverter.java:119)
at com.jfoenix.skins.JFXTimePickerContent.updateValue(JFXTimePickerContent.java:427)
at com.jfoenix.skins.JFXTimePickerContentTest.updateValue(JFXTimePickerContentTest.java:11)

我该如何解决这个问题?

更新1

java.time.format.DateTimeParseException: Text '8:35 PM' could not be parsed at index 5
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1777)
    at javafx.util.converter.LocalDateTimeStringConverter$LdtConverter.fromString(LocalDateTimeStringConverter.java:208)
    at javafx.util.converter.LocalTimeStringConverter.fromString(LocalTimeStringConverter.java:119)
    at com.jfoenix.skins.JFXTimePickerContent.updateValue(JFXTimePickerContent.java:424)
    at com.jfoenix.skins.JFXTimePickerContentTest.updateValue(JFXTimePickerContentTest.java:11)

解决方案

Java 从 windows 首选项获取 JVM 的默认语言环境。

我的 JVM 默认语言环境是韩语,即使我将 LocalTimeStringConverter 设置为英语,它也会抛出异常。

我们可以通过多种方式为 jvm 设置语言环境。 oracle Reference

或更改代码。以下代码是:

String input = "8:45pm";
input = input.toUpperCase(); // DateTimeFormatter expects "PM" (uppercase)
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("h:mma", Locale.ENGLISH);
LocalTimeStringConverter converter = new LocalTimeStringConverter(dtf, dtf);
System.out.println(converter.fromString(input));

正如雨果所说。

感谢您的回答。

此格式接受的样式略有不同,因此您的输入必须转换为“8:45 PM”。

String input = "8:45pm";
input = input.replaceAll("pm", " PM").replaceAll("am", " AM");
LocalTimeStringConverter converter = new LocalTimeStringConverter(FormatStyle.SHORT, Locale.ENGLISH);
System.out.println(converter.fromString(input));

但是,java.time.format.FormatStyle 文档说:

/**
 * Short text style, typically numeric.
 * For example, the format might be '12.13.52' or '3:30pm'.
 */
SHORT;

我猜,这需要修复。

英语语言环境时间值的预定义格式是 'HH:MM {A/P}M'。所以首先,你的时间和 'pm' 字符串之间必须有一个 space,第二个 'pm' 必须是大写的。另请参阅此 java 教程页面:https://docs.oracle.com/javase/tutorial/i18n/format/dateFormat.html

String input = "8:45 PM";

干杯!

由于您的输入字符串是 8:45pm 并且 FormatStyle.SHORT 需要 pm 之前的 space,我使用 DateTimeFormatter 代替:

String input = "8:45pm";
input = input.toUpperCase(); // DateTimeFormatter expects "PM" (uppercase)
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("h:mma", Locale.ENGLISH);
LocalTimeStringConverter converter = new LocalTimeStringConverter(dtf, dtf);
System.out.println(converter.fromString(input));

输出为:

20:45