簡體   English   中英

java.time.format.DateTimeParseException:文本'Mi Mai 09 09:17:24 2018'無法在索引0處解析

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM