2016-11-25 101 views
0

我嘗試以下方式與new SimpleDateFormat(pattern).parse("Nov 17, 2016 7:26:57 PM")但他們沒有工作:如何解析日期字符串形式爲「2016年11月17日7:26:57 PM」的日期?

MMM d, yyyy h:m:s a 
MMM dd, yyyy HH:mm:ss a 
MMM dd, yyyy h:m:s a 

我可以成功地解析這個字符串的唯一方式是使用new Date("Nov 17, 2016 7:26:57 PM")但這一呼籲已經過時了。據說根據API文檔將其替換爲DateFormat.parse(),但實際上,當我呼叫DateFormat.getDateTimeInstance().parse("Nov 17, 2016 7:26:57 PM")時,它不能解析相同的字符串。那麼除了使用new Date()之外,我應該如何正確解析這個字符串呢?

+4

'MMM d,YYYY^h兩位數:mm:ss的了'應該工作,如果你指定的英語語言環境。如果沒有,請提供[mcve]。 –

+0

是的英語區域設置解決了問題!謝謝! – Ivan

回答

3

您需要:

  • 確保該模式是正確的
  • 指定正確的語言環境

在這種情況下,你想爲英語月份名稱在英語語言環境:

SimpleDateFormat sdf = new SimpleDateFormat("MMM d, yyyy h:mm:ss a", Locale.ENGLISH); 

注意,這種模式是不是任何你指定的國家:

  • 我們需要d因爲想必你倒是得到‘11月5日’,而不是‘11月5日’
  • 我們需要h因爲你在10
  • 得到12小時小時,只有一個數字的值,我們需要mmss因爲你會得到分鐘和秒鐘
+0

我已經測試過,在指定區域設置後,所有三種模式都可以正確解析... – Ivan

+0

@ivanhjc:儘管它們都會解析無效數據,例如, 「23:00:00 AM」,「7:5:6PM」。我提供的模式是一個更好的模式。絕對值得非常關注這類事情。 –

-1

代碼:

public void testDate() throws ParseException { 
     SimpleDateFormat sdf = new SimpleDateFormat("MMM d, yyyy h:mm:ss a"); 
     Date d1 = sdf.parse("Nov 17, 2016 7:26:57 PM"); 
     System.out.println(d1); 
     return; 
    } 

輸出:

Thu Nov 17 19:26:57 CET 2016 
+1

您仍在使用系統默認區域設置。 –

+0

這個代碼不適用於我,因爲未指定區域設置。它只有在我將一個英文語言環境添加到構造函數中時才起作用。 – Ivan

相關問題