2015-02-11 68 views
0

請考慮此格式化當前日期的程序,並嘗試再次解析它。它用法語成功,但英語失敗,我不明白爲什麼。日期解析成功使用法語但英語失敗

import java.util.Locale; 
import java.text.DateFormat; 
import java.time.Instant; 
import java.util.Date; 
import java.text.SimpleDateFormat; 

public class HelloWorld{ 

    public static void main(String []args){ 

     try{ 
      SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss", Locale.ENGLISH); 
      DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT, Locale.ENGLISH).parse(formatter.format(new Date())); 

      System.out.println("English - success"); 
     }catch(Exception ex){ 
      System.out.println(ex); 
     } 

     try{ 
      SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm:ss", Locale.FRENCH); 

      DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT, Locale.FRENCH).parse(formatter.format(new Date())); 
      System.out.println("French - success"); 

     }catch(Exception ex){ 
      System.out.println(ex); 
     } 
     System.out.println(Locale.getDefault()); 
    } 
} 

輸出:

java.text.ParseException: Unparseable date: "11 Feb 2015 11:09:26"                               
French -success                                            
en_US 

請看http://docs.oracle.com/javase/7/docs/api/java/text/DateFormat.html#parse%28java.lang.String,%20java.text.ParsePosition%29告訴我,我應該使用模式或其他任何東西了。這種方法是爲了解析沒有模式的String

+0

如果您嘗試先用'DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT,Locale.ENGLISH).format'格式化'Date',它是否具有相同樣式,您嘗試解析?也許你會以這種方式找到你的錯誤。 – Zhedar 2015-02-11 11:25:03

+0

你對這個例外感到驚訝嗎?您正在格式化,然後使用不同的格式進行解析。你很幸運,法國默認格式符合該模式。 – xehpuk 2015-02-11 11:38:44

回答

3

我懷疑你的輸入格式字符串是錯誤的。

根據documentationJun 30, 2009 7:03:47 AM對於Default設置中的en_US將是有效的格式。

您可以通過首先格式化給定的Date來始終檢查格式是否正確。
例如 System.out.println(DateFormat.getDateTimeInstance(DateFormat.DEFAULT,DateFormat.DEFAULT, Locale.ENGLISH).format(new Date()));給出Feb 11, 2015 12:34:48 PM,其不適合11 Feb 2015 11:09:26

這應該是你正確的格式化字符串en_US解析:Feb 11, 2015 11:09:26 AM。請記住,這是上午/下午12小時的時間格式,這可能很煩人。

+0

輸入格式可以是任何東西。這就是這種方法的目的。 但是我試着用「MMM,dd yyyy HH:mm:ss a」就像你所建議的那樣,它也不起作用。 – Maxoudela 2015-02-11 11:36:05

+0

您只需要一個H來指定12小時格式。然後它會工作。但奇怪的是,這種方法不能用英文解析「dd MMM yyyy」,而是用法語來解析。 – mhlz 2015-02-11 11:37:42

+1

沒有啓發式來檢測輸入格式,所以它不能是任何東西。如果是這樣的話,日期解析不會太痛苦;)你只需使用默認參數,這些參數在某處定義以反映標準。 – Zhedar 2015-02-11 11:40:26

0

英語的默認格式是這樣的:

SimpleDateFormat formatter = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a", Locale.ENGLISH); 
+0

它在法國成功。所以這可能不是問題。 – Zhedar 2015-02-11 11:26:42

+0

對不起,我看到了。修改了答案。 – vikingsteve 2015-02-11 11:32:39

0

你確定DD MMM YYYY HH:mm:ss的是一個正確的英文格式不他們使用一個月像美國格式天前?

+0

我試圖使用「MMM dd yyyy HH:mm:ss」,但它不起作用。但我認爲這不是問題。 – Maxoudela 2015-02-11 11:33:54