2012-06-25 87 views
1

有許多SO問題處理計算Java中兩個日期或兩次之間的差異。許多答案指出了核心Java Date類的問題,並建議使用Jodatime,但AFAIK,沒有任何建議如何使用jsr310來做到這一點。Java jsr310:日期和時間之間的差異

那麼,有沒有什麼方法來計算jsr310中兩個日期或兩次之間的差異?


僅供參考,下面的問題處理這個問題:

在Java核心:

在Jodatime:

回答

0

如何做到這一點取決於什麼日期或日期時間類正在使用。

如果在實時操作系統(即隨時間區等等這樣的日期時間也可以被精確對時間線的精確Instant),則可以使用Duration類(javadoc) - 例如

Duration diff = Duration.between(InstantProvider startInc, InstantProvider endInc); 

其中一個InstantProvider能夠

另外,如果你是在假設的操作時間(即沒有時區等),你可以使用Period類(javadoc),以獲得兩個實例之間的區別的LocalDate - 例如

// diff in days, months and years: 
Period diff = Period.between(LocalDate start, LocalDate end); 

// diff in days: 
Period diff = Period.daysBetween(LocalDate start, LocalDate end); 

但是,我不知道有任何方便的方法來獲得兩個LocalDateTimes或LocalTimes之間的區別。但是......這可以使用Period來完成,如下所示:

// diff between LocalDateTimes: 
public static Period between(LocalDateTime start, LocalDateTime end){ 
    return Period.of(
    end.getYear()-start.getYear(), 
    end.getMonthOfYear().getValue()-start.getMonthOfYear().getValue(), 
    end.getDayOfMonth()-start.getDayOfMonth(), 
    end.getHourOfDay()-start.getHourOfDay(), 
    end.getMinuteOfHour()-start.getMinuteOfHour(), 
    end.getSecondOfMinute()-start.getSecondOfMinute(), 
    end.getNanoOfSecond()-start.getNanoOfSecond() 
); 
} 

// diff between LocalTimes: 
public static Period between(LocalTime start, LocalTime end){ 
    return Period.of(0, 0, 0, 
    end.getHourOfDay()-start.getHourOfDay(), 
    end.getMinuteOfHour()-start.getMinuteOfHour(), 
    end.getSecondOfMinute()-start.getSecondOfMinute(), 
    end.getNanoOfSecond()-start.getNanoOfSecond() 
); 
} 
+0

只是希望可以幫助其他人在使用Joda時間時使用'LocalDateTime'對象時遇到類似的困惑:除了具有'weeks'參數(第三個參數)外,還有一個類似於'Period.of'方法的構造方法,就在幾個月後),並且'PeriodType'應該設置爲'PeriodType.yearMonthDayTime()'。不幸的是,當試圖創建「持續時間」時,它變得無效,因爲月份差異從28日到31日不等,月份沒有標準表示。如果這是_your_目標,那麼你應該轉換爲'Date',然後減去'getTime()'。 – pickypg

+0

繼續關於Joda時間的評論:除非你碰巧知道它,否則在上面的計算中''週數'應該設置爲'0'。 amaidment的方法是有效的,我的評論僅僅是這是我想要做的限制,我想爲那些現在使用Joda的人提供答案,而不是等待JDK8。 – pickypg

+1

@pickypg - 爲了清楚起見,問題/答案與使用jsr310(最終應用於Java 8)有關,並且與使用jodatime無關。 – amaidment

5

回答wrt到最終的JDK1.8版本。

有兩個數量級 - DurationPeriod。持續時間是基於時間的(納米),週期是基於日期的(年/月/日)。

的時間可以通過以下兩種方法(我喜歡第一)一種能夠容易地計算出的相同類型的兩個顳對象之間的量:

long days = ChronoUnit.DAYS.between(start, end); 
long days = start.until(end, ChronoUnit.DAYS); 

Duration兩者之間的相同類型的時間對象可以

Duration d = Duration.between(start, end); 

目的之間可以如下計算:如下計算

Period p = Period.between(start, end); 
+0

謝謝 - 我可以請求你澄清'Period' - 當你說'Period'是'基於日期的'時,這是否意味着它將不再有小時,分鐘等概念? 1.8 b75的Javadoc仍然顯示採用h,m,s等的靜態構造函數。此外,'(TemporalAccessor,TemporalAccessor)'方法是否考慮了時間差異以及日期差異? (爲了澄清,我仍然使用0.6.3) – amaidment

+0

期間/持續時間有很多變化。期間現在只有年/月/日。所有這些方法都是基於當地時間或時間,並據此工作。 – JodaStephen