在我的应用中,当我选择' 20:45'到TimePicker,它格式化为'晚上8:45' 我可以使用以下代码重现该问题:
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)
如何解决此问题?
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));
像雨果说的那样。
感谢您的回答。
答案 0 :(得分:3)
英语 - 语言环境时间值的预定义格式为“HH:MM {A / P} M”。首先,你的时间和'pm'字符串之间必须有一个空格,第二个'pm'必须是大写的。另请参阅此java教程页面:https://docs.oracle.com/javase/tutorial/i18n/format/dateFormat.html
String input = "8:45 PM";
干杯!
答案 1 :(得分:1)
此格式接受略有不同的风格,因此您的输入必须转换为" 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;
我猜,这需要修复。
答案 2 :(得分:1)
由于您的输入字符串为8:45pm
且FormatStyle.SHORT
需要pm
之前的空格,我改为使用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