2012-11-26 113 views
3

我在開發過程中卡住了, 我有這樣一種方式,我需要找到兩個日期之間即延遲要求.. currentdate-date from database將毫秒轉換爲適當的java日期格式?

,我需要顯示的dd:hh:mm格式延遲。在提到很多參考資料後,我發現如何轉換爲單位毫秒小時和分鐘,但是我期望的結果是:如果結果是一些X毫秒,我需要以恰當的日期分秒數顯示它

例如:2天:03分鐘:46秒

這裏是代碼我使用:

Calendar calendar1 = Calendar.getInstance(); 
Calendar calendar2 = Calendar.getInstance(); 
calendar1.setTime(date); 
calendar2.setTime(date1); 
long milliseconds1 = calendar1.getTimeInMillis(); 
long milliseconds2 = calendar2.getTimeInMillis(); 
long diff = milliseconds1 - milliseconds2; 
System.out.println("diff ::"+diff); 
long diffSeconds = diff/1000; 
long diffMinutes = diff/(60 * 1000); 
long diffHours = diff/(60 * 60 * 1000); 
long diffDays = diff/(24 * 60 * 60 * 1000); 

任何人都可以請建議我該怎麼做進一步? 請指導我..

+0

在該代碼中,假設每天有24小時,每小時60分鐘,每分鐘有60秒。這在夏時制的國家以及閏秒行星中都不適用。你應該使用像Joda Time這樣的日曆框架,讓它完成繁重的工作。 – wallenborn

+0

@wallenborn,是啊現在在喬達時間做背景工作,你可以請幫我如何使用它 – Esh

回答

3

您需要先計算diffDays

diffDays = diff/(24 * 60 * 60 * 1000); 

然後計算剩餘毫秒:

diff -= diffDays * 24 * 60 * 60 * 1000; 

使用新的diff計算diffHours等等...

一個建議:使用像這樣的常數值:

private static final int SECOND = 1000; 
private static final int MINUTE = 60 * SECOND; 
// and so on 
+2

+1簡單的任務,簡單的解決方案。 – Frank

+0

丹可以請你詳細解釋一下 – Esh

+0

這個假設每天都有24小時,如果你住在夏令時的地區,每年都會失敗兩次。 – wallenborn

8

使用Joda Time。 Java API不包含處理「兩個日期/時間值之間的差異」的任何內容。在喬達時間,你可以選擇Period(這實際上是以日曆爲中心的差異)和Duration(這實際上只是一個經過的時間差)。

理想情況下,使用喬達時間全部您的日期/時間問題 - 這是一個更好,更好的API。

在這種情況下,我懷疑你已經邏輯得到了Duration,但你會想要將它轉換爲Period,以使用PeriodFormatter進行字符串轉換。

+0

可以請你提供一些例子喬達時間 – Esh

+0

@Esh:那麼,你試過什麼? –

+0

到目前爲止,我試圖獲得單獨的小時和分鐘,現在我卡在年表概念,我想設置年表'000',但它採取默認的ISOChronology [亞洲/加爾各答],不知道如何覆蓋它 – Esh

0
Calendar calendar1 = Calendar.getInstance(); 
Calendar calendar2 = Calendar.getInstance(); 
calendar1.setTime(date); 
calendar2.setTime(date1); 

int dayDiff = calendar1.get(Calendar.DAY_OF_MONTH) - calendar2.get(Calendar.DAY_OF_MONTH); 
int hourDiff = calendar1.get(Calendar.HOUR_OF_DAY) -calendar2.get(Calendar.HOUR_OF_DAY); 
int dayDiff = calendar1.get(Calendar.SECOND) - calendar2.get(Calendar.SECOND); 
1

-我會建議使用Joda圖書館當你處理任何日期時間的問題。

約達時間具有時間間隔的一個概念:

Interval interval = new Interval(oldTime, new Instant());

順便說,約達有兩個概念:間隔用於表示兩個時刻之間的時間間隔(代表上午08點之間的時間上午10點),以及表示時間長度沒有實際時間界限的持續時間(例如,代表兩個小時!)

1

隨着JodaTime,這非常簡單。請參閱以下代碼:

public void testJoda() { 
    DateTime then = new DateTime("2012-03-23T02:30:00.000"); 
    DateTime now = new DateTime("2012-03-24T02:29:00.000"); 

    DurationFieldType[] ddhhmm = { DurationFieldType.days(), 
      DurationFieldType.hours(), DurationFieldType.minutes() }; 
    Period p = new Period(then, now, PeriodType.forFields(ddhhmm)); 
    System.out.println(p.toString()); 

    p = new Period(then, now, PeriodType.days()); 
    System.out.println(p.toString()); 

    p = new Period(then, now, PeriodType.hours()); 
    System.out.println(p.toString()); 

    DurationFieldType[] hhmm = { DurationFieldType.hours(), DurationFieldType.minutes() }; 
    p = new Period(then, now, PeriodType.forFields(hhmm)); 
    System.out.println(p.toString()); 
} 

其中測試23h59m的區間。如預期其輸出:

PT23H59M 
P0D 
PT23H 
PT23H59M 

以相同的時間間隔,一天過去了,就在3月25日春季DST跳:

DateTime then = new DateTime("2012-03-24T02:30:00.000"); 
DateTime now = new DateTime("2012-03-25T03:29:00.000"); 

和你正確地得到:

P1DT-1M 
P1D 
PT23H 
PT23H59M 

真的沒有那麼容易。