2017-04-24 43 views
2

在我的應用程序,當我選擇'20:45' 至TimePicker,它的格式,如‘下午8:45’ 我可以用下面的代碼重現該問題:無法解析,FomatStyle

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獲取默認的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)); 

就像Hugo說的。

感謝您的回答。

回答

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

+0

這使我的應用程序工作的魅力。但是,我想知道使用FormatStyle.SHORT – jkh6100

+0

的問題在我的測試中,我注意到'FormatStyle.SHORT'需要分鐘和「PM」之間的空格(所以它只在輸入是'8:45 PM' (在「5」之後有一個空格) – 2017-04-24 13:49:24

+0

我已經測試過你說了。輸入是「8:45 PM」但是它仍然拋出同樣的異常我更新了這個異常(Update1) – jkh6100

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; 

我猜,這需要加以固定。

+0

我嘗試使用你的代碼,但它仍然會拋出同樣的異常 – jkh6100

+0

似乎對我很好,你確定你的字符串我s被替換爲「8:45 PM」? – sovas

+0

是的。我曾經通過其他電腦試過這段代碼。但仍然無法工作。我的jdk版本是「8u110」 – jkh6100

3

英語語言環境時間值的預定義格式爲'HH:MM {A/P} M'。首先,你的時間和'pm'字符串之間必須有一個空格,第二個'pm'必須是大寫字母。另請參閱此Java教程頁面:https://docs.oracle.com/javase/tutorial/i18n/format/dateFormat.html

String input = "8:45 PM"; 

乾杯!

+0

我試過使用你的代碼,但它仍然會拋出一個相同的異常 – jkh6100

+0

確保'fromString(input)'獲取'8:45 PM'作爲輸入後能否再次發佈異常消息? –

+0

我更新了新的異常。謝謝 – jkh6100