2012-01-25 124 views
7

我想使用Date和Calendar類來計算java中兩個日期/時間之間的差異。我擁有的格式是「2012-01-24 12:30:00 PM」。計算Java中考慮AM/PM的日期/時間差異

我已經實現了我自己的方法,也谷歌它與他人合作,但沒有得到正確的提示來處理AM和PM值。

每當時間有12(AM/PM)時,日期/時間差異就會陷入困境。例如,如果我有日期/時間「2012-01-24 12:30:00 PM」和「2012-01-24 02:30:00 PM」,則顯示差異爲10小時。

考慮到this link上的代碼,如何修改它以處理AM和PM。

至字符串日期轉換爲日期我用下面的代碼:

String sessionTimeStart = "2012-01-24 12:30:00 PM"; 
    String sessionTimerEndOrCurrent = "2012-01-24 02:30:00 PM"; 
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"); 

    Date d1 = null; 
    Date d0 = null; 
    try { 
     d1 = format.parse(sessionTimeStart); 
     d0 = format.parse(sessionTimerEndOrCurrent); 
    } catch (ParseException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
+0

如何將字符串轉換爲Date對象?你如何計算差異?如果你使用你鏈接的代碼,你怎麼稱呼它? – Thomas

+0

@Thomas我已更新帖子 – rizzz86

回答

6

問題是您的日期格式:而不是yyyy-MM-dd HH:mm:ss a使用yyyy-MM-dd hh:mm:ss a

HH將是當天的小時(0-23),而hh將是上午/下午(1-12)的小時。因此,您的日期格式爲02:30:00將被解析爲只是該格式,而不是轉換爲PM版本(在一天中的時間將是14:30:00)。

+0

我認爲你是對的@Thomas。我會嘗試將它改爲'......'並測試我的所有情況。 – rizzz86

1

自己不要建了,使用建立的圖書館。 Jodatime被廣泛使用。

+0

感謝您的建議@他。但正如我所提到的,我必須使用Date和Calendar類。 – rizzz86

1

旁邊使用Apache Commons DateUtils DurationFormatUtils formatPeriod方法將做到神奇。

祝你好運!

編輯 假設你有一個日期和日期b。在這點上初始化,

String format="HH:mm:ss.SSS"; // whatever you wish 
boolean padWithZeros=true; // whatever you wish 
TimeZone timezone=null; // whatever you wish 
long timeA = a.getTime(); 
long timeB = b.getTime(); 

String period = DurationFormatUtils.formatPeriod(timeB, timeA, format, padWithZeros, timezone); 
+0

感謝您的建議@aviad。但正如我所提到的,我必須使用Date和Calendar類。 – rizzz86

+0

@ rizzz86,看我的編輯。 – aviad

-1

日曆有梅索德的add()可用於從其減去了。看看它。無論如何,您應該使用日曆而不是日期,因爲大多數日期操作已被棄用。

+1

問題是關於計算差異而不是比較。 – aviad

+0

對不起,我誤解了API。思想compareTo()會返回以毫秒爲單位的差異。 –

+0

找到了另一種解決方案。也許這次是正確的;-) –

3

所以,你有這些日期爲字符串?用適當的格式字符串SimpleDateFormat解析它們,並計算以小時爲單位的區別:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a"); 

Date d1 = df.parse("2012-01-24 12:30:00 PM"); 
Date d2 = df.parse("2012-01-24 02:30:00 PM"); 

int hoursDifference = (int)((d2.getTime() - d1.getTime())/3600000L); 
System.out.println("Difference in hours: " + hoursDifference); 

你的錯誤是,你正在使用HH(24-hour小時),而不是HH(12小時小時)在您的格式字符串。

+0

謝謝@Jesper,我也會嘗試你的解決方案。但HH和HH似乎是我在這裏失蹤的情況 – rizzz86

4

它顯示10小時的原因,區別在於解析輸入時在模式中出現錯誤。

下面是一個使用SimpleDateFormat一個例子:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"); 

Date date1 = df.parse("2012-01-24 12:30:00 PM"); 
Date date2 = df.parse("2012-01-24 02:30:00 PM"); 

long differenceInHours = Math.abs(date1.getTime() - date2.getTime())/1000/60/60); 

將返回10

當我們稍稍在一天時間更改日期格式模式,使用hh在AM/PM(1-12)小時,而不是HH(0-23):

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a"); 

它返回(預計)2

查看documentation for SimpleDateFormat讓您的模式正確。