2009-07-20 41 views
11

爲什麼解析「23:00 PM」與SimpleDateFormat("hh:mm aa")返回上午11點?爲什麼使用SimpleDateFormat(「hh:mm aa」)解析「23:00 PM」會返回11 a.m.?

+1

是的......這個問題甚至沒有意義。垃圾進垃圾出。你可能是正確的,它在內部爲'下午'增加了12個小時。 – mpen 2009-07-20 17:48:45

+0

@彼得:我知道這個!我幾分鐘後才發現問題所在。這不是問題。 (您是否曾經調試過別人的代碼?那麼它會有意義的。) – OscarRyz 2009-07-20 17:58:32

回答

22

您應該會收到一個異常,因爲「23:00 PM」不是有效的字符串,但在處理日期解析時,Java的日期/時間設施默認爲lenient

邏輯是,下午23:00是晚上11:00,這是第二天上午11:00的12小時。你還會看到諸如「4月31日」被解析爲「5月1日」(4月30日後一天)的內容。

如果您不想要這種行爲,請使用DateFormat#setLenient(boolean)將SimpleDateFormat上的lenient屬性設置爲false,並且在傳遞無效日期/時間時會得到異常。

1

我猜想,這確實是這樣的:

hours = hours % 12; 

,以確保時間是在適當的範圍內。

18

如果您要解析24小時時間,您希望將「HH:mm aa」作爲格式。

public static void main(String[] args) throws ParseException { 
    SimpleDateFormat df = new SimpleDateFormat("HH:mm aa"); 
    final Date date = df.parse("23:00 PM"); 
    System.out.println("date = " + df.format(date)); 
} 

輸出

date = 23:00 PM 
+0

SimpleDateFormat df = new SimpleDateFormat(「HH:mm aa」);正在給皮棉警告.. 你有想法如何解決這個問題嗎? – NovusMobile 2013-01-25 05:41:52

+0

薩蒂揚,警告是什麼? – 2013-01-27 04:07:18

15

你試過HH:mm aa

HH是24小時,同時hh是12

2

23:00可以被認爲是11:00 第二天。 Javascript和PHP的工作就像這樣,但我不能說Java。

4

這裏是在javadoc

H  Hour in day (0-23)  
k Hour in day (1-24) 
K Hour in am/pm (0-11)  
h Hour in am/pm (1-12) 

注意, 「H」 將是小時1-12 specifed的格式選項。如果您想要處理1-24,請嘗試「k」。爲0-23嘗試「H」。但是如果你輸入不可能的數據,我不會期望有效的結果。

相關問題