无法解析,FomatStyle

时间:2017-04-24 11:14:00

标签: java javafx java-time

在我的应用中,当我选择' 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)

如何解决此问题?

UPDATE1

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));
像雨果说的那样。

感谢您的回答。

3 个答案:

答案 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:45pmFormatStyle.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