Java 无法分析,FomatStyle
在我的应用程序中,当我选择“20:45”计时选择器时,它的格式为“8:45 pm” 我可以用以下代码重现该问题:Java 无法分析,FomatStyle,java,javafx,java-time,Java,Javafx,Java Time,在我的应用程序中,当我选择“20:45”计时选择器时,它的格式为“8:45 pm” 我可以用以下代码重现该问题: String input = "8:45pm"; LocalTimeStringConverter converter = new LocalTimeStringConverter(FormatStyle.SHORT, Locale.ENGLISH); System.out.println(converter.fromString(input)); 这会引发异常: java.tim
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从windows首选项获取JVM的默认区域设置
我的JVM默认语言环境是韩语,即使我将LocalTimeStringConverter设置为英语,也会出现异常
我们可以通过几种方式设置jvm的区域设置
或者更改代码。以下代码是:
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” 但是,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'字符串之间必须有一个空格,第二个'pm'必须是大写。另请参见本java教程页面:
干杯 由于您的输入字符串是
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
我试着使用你的代码,但它仍然抛出相同的异常对我来说很好,你确定你的字符串被替换为“8:45 PM”吗?是的。我曾在其他计算机上尝试过这个代码。但仍然不起作用。我的jdk版本是“8u110”,我尝试使用你的代码,但它仍然抛出相同的异常在确保“fromString(input)”获得“8:45 PM”作为输入后,你可以再次发布异常消息吗?这让我的应用程序很有魅力。但是,我想知道使用FormatStyle.SHORT的问题。在我的测试中,我注意到
FormatStyle.SHORT
要求在分钟和“PM”之间有一个空格(因此只有当输入是8:45 PM
(在“5”之后有一个空格)我已经测试过你说的。输入是“8:45 PM”但是它仍然会抛出相同的异常。我更新了这个异常(Update1)我在这里做了一些测试。基本上,使用FormatStyle.SHORT
它只在输入为8:45 PM
(其他任何东西都会抛出异常)。使用DateTimeFormatter
(上面我回答中的代码),它仅在输入为8:45pm
或8:45pm
时有效(因为我使用的是toUpperCase
方法,所以这两种情况都有效)。
/**
* Short text style, typically numeric.
* For example, the format might be '12.13.52' or '3:30pm'.
*/
SHORT;
String input = "8:45 PM";
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));