[英]java.time.format.DateTimeParseException: Text '2019-02-16 09:29:32.959' could not be parsed, unparsed text found at index 10
[英]java.time.format.DateTimeParseException: Text 'Mi Mai 09 09:17:24 2018' could not be parsed at index 0
我正在嘗試使用德語區域設置格式化日期時間對象,但是我收到了錯誤。
String dateString = "Mi Mai 09 09:17:24 2018";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EE MMM dd HH:mm:ss yyyy", Locale.GERMAN);
LocalDateTime dateTime = LocalDateTime.parse(dateString, dtf);
錯誤:
java.time.format.DateTimeParseException: Text 'Mi Mai 09 09:17:24 2018' could not be parsed at index 0
解決方案現在和現在:
System.setProperty("java.locale.providers", "COMPAT,CLDR");
String dateString = "Mi Mai 09 09:17:24 2018";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EE MMM dd HH:mm:ss yyyy", Locale.GERMAN);
LocalDateTime dateTime = LocalDateTime.parse(dateString, dtf);
System.out.println(dateTime);
輸出(在Java 9和Java 10上測試):
2018-05-09T09:17:24
您的代碼中唯一的變化是我插入了System.setProperty("java.locale.providers", "COMPAT,CLDR");
在計划的開頭。 根據文檔,這不應該真正起作用,但是當我嘗試它時它確實有效。 相反,正確的方法是在運行Java程序時在命令行上提供相同的系統屬性。 例如:
java -Djava.locale.providers=COMPAT,CLDR com.ajax.ParseTwoLetterDayOfWeekAbbreviationInGerman
感謝Joep Weijers在評論中指出必須在命令行上設置屬性。 有趣的是,同樣的系統屬性破壞了我的Java 8上的代碼。
更現代的解決方案
String dateString = "Mi. Mai 09 09:17:24 2018";
我在字符串中的Mi
之后需要一個點(一個句點)來表示它是一個縮寫。
要解析德語Java中的日期需要所謂的語言環境數據,包括德語和其他語言中使用的星期和數月的名稱和縮寫。 為了混淆事物,這些數據來自多個來源。 在所有Java 8,9和10中,Java包含來自至少兩個源的區域設置數據,Java自己的區域設置數據和來自CLDR的標准化區域設置數據,Unicode公共區域設置數據存儲庫(我不知道是否還有一個或兩個源) 。 在Java 8中,Java自己的數據是默認數據,如果您需要這些數據,則需要指定CLDR。 在Java 9及更高版本中,它是相反的方式:CLDR是默認值,但舊的Java數據可用作COMPAT。 這很快解釋了您的代碼在Java 8上運行的注釋 ,但在Java 10上失敗了。
顯然,Java語言環境數據有Mi
而沒有dot作為Mittwoch(星期三)的縮寫,而CLDR有Mi.
帶點。 還有許多其他差異。
鏈接
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
/**
*
* @author Ali Hassan
*/
public class LeapTEST {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
String dateString = "Mi Mai 09 09:17:24 2018";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EE MMM d HH:mm:ss yyyy", Locale.GERMAN);
LocalDateTime dateTime = LocalDateTime.parse(dateString, dtf);
System.out.print(dateTime);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.