无法解析,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
在我的应用程序中,当我 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