2010-01-05 67 views
35

我有兩個Date對象,我需要得到時間差,因此我可以確定它們之間的總小時數。他們恰好來自同一天。我想要的結果會有小時和分鐘。查找兩個日期之間的總小時數

當我將Date對象上使用的ToString()我得到這樣的:週五2009年12月18日8時08分10秒CST

我已經試過如下:

long diff=(this.endDate.getTime()-this.startDate.getTime())/(60*60 * 1000); 

但這只是給我幾小時,而不是分鐘。 我知道這是一個簡單的問題,但我無法弄清楚atm。

編輯: 對於那些感興趣的最終解決方案。由於邁克爾·布魯爾 - 戴維斯

Period p = new Period(this.startDate, this.endDate); 
long hours = p.getHours(); 
long minutes = p.getMinutes(); 

String format = String.format("%%0%dd", 2); 

return Long.toString(hours)+":"+String.format(format, minutes); 
+0

請更新您的答案@ clang1234。這很容易引起誤解,並且可以很容易地引入錯誤。此代碼僅適用於'startDate'和'endDate'在同一天的情況。你需要做一些像'Hours.hoursBetween(startTime,endTime).getHours()'那樣的註釋。 – Arjit 2016-12-26 11:22:23

回答

57

下面是它如何與Joda time工作:

DateTime startTime, endTime; 
Period p = new Period(startTime, endTime); 
int hours = p.getHours(); 
int minutes = p.getMinutes(); 

你可以與喬達的格式化,例如,PeriodFormat格式,但我建議使用Java的。有關更多詳細信息,請參閱this question

+1

這只是完美的。感謝Joda Time鏈接。但是,如何讓顯示爲「H:mm」,其中H是小時和m分鐘。例如「1:05」。目前會顯示「1:5」 – clang1234 2010-01-05 09:33:09

+0

爲您添加格式鏈接。 – 2010-01-05 16:39:18

+1

太好了。感謝您的幫助 – clang1234 2010-01-05 19:02:55

0

所以的getTime()方法,我想,返回一個整數。

在這種情況下,左邊的括號中有int類型,對吧?

(60*60*1000) 

也是一個int。

這意味着你得到長diff =((int)/(int)),所以整數除法是在你將東西放到很長時間之前完成的。因此你失去了你的分鐘。

嘗試鑄造它們之前,你分裂。

+0

getTime()方法返回一個Long而不是int。 – clang1234 2010-01-05 01:24:21

+0

啊......然後羅曼·範大壩說了些什麼,我想。也是格雷格說的。 – 2010-01-05 01:47:28

60

這應該工作。

long secs = (this.endDate.getTime() - this.startDate.getTime())/1000; 
int hours = secs/3600;  
secs = secs % 3600; 
int mins = secs/60; 
secs = secs % 60; 
+3

我喜歡這個解決方案,因爲這隻需要純Java。對我來說就夠了。 – Gondy 2015-01-29 13:52:02

8

這是一個簡單的方法:

private static int hoursDifference(Date date1, Date date2) { 

    final int MILLI_TO_HOUR = 1000 * 60 * 60; 
    return (int) (date1.getTime() - date2.getTime())/MILLI_TO_HOUR; 
} 
+0

使用DateTimeConstants.MILLIS_PER_HOUR如果使用焦達時間 – Troveldom 2014-05-26 14:22:02

-1

下面是一個簡單的方法: - 檢查Date format,如果你的約會不會以這種格式然後改變它,並通過這種方法,它會給你一個String這是你的結果。按照要求修改方法。

private String getDateAsTime(String datePrev) { 
     String daysAsTime = ""; 
     long day = 0, diff = 0; 
     String outputPattern = "yyyy:MM:dd HH:mm:ss"; 
     SimpleDateFormat outputFormat = new SimpleDateFormat(outputPattern); 
     Calendar c = Calendar.getInstance(); 
     String dateCurrent = outputFormat.format(c.getTime()); 
     try { 
      Date date1 = outputFormat.parse(datePrev); 
      Date date2 = outputFormat.parse(dateCurrent); 
      diff = date2.getTime() - date1.getTime(); 
      day = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     if (day == 0) { 
      long hour = TimeUnit.HOURS.convert(diff, TimeUnit.MILLISECONDS); 
      if (hour == 0) 
       daysAsTime = String.valueOf(TimeUnit.MINUTES.convert(diff, TimeUnit.MILLISECONDS)).concat(" minutes ago"); 
      else 
       daysAsTime = String.valueOf(hour).concat(" hours ago"); 
     } else { 
      daysAsTime = String.valueOf(day).concat(" days ago"); 
     } 
     return daysAsTime; 
    } 

希望這將幫助,

1

請按照Somaiah說的建議的評論,使用小時,而不是:

小時比= Hours.hoursBetween(開始時間,結束時間);

對getHours()的調用將只返回時差的小時部分,並忽略所有年份和月份的差異,因此在某些情況下它將不正確。

如果您使用Period.toStandardHours()嘗試將時差轉換爲小時,那麼如果兩個日期之間的時差包括年份或月份的差異,則計算會拋出異常,因爲月的長度未知。

相關問題