2009-01-17 150 views
17

我覺得很有趣的是,Java(或java.util庫)沒有內置函數來計算日期差異。我想從另一個日期減去一個日期以獲得它們之間的時間間隔。做這個的最好方式是什麼?計算Java中的日期差異

我知道簡單的方法是以毫秒爲單位的時間的差異,然後將其轉換爲幾天。但是,我想知道這是否適用於所有情況(夏令時等)。

+2

有關某些背景,請參閱http://www.xmission.com/~goodhill/dates/deltaDates.html。 – 2009-01-17 15:24:25

+0

這是一篇不錯的文章。謝謝! – Anirudh 2009-01-18 08:43:16

+0

@Anirudh搜索StackOverflow中的「joda」和術語,如「span」,「Interval」,「Duration」,「Period」。你會發現許多討論的例子。 – 2014-03-19 17:13:32

回答

6

我知道簡單的方法就是採取的時間 差以毫秒爲單位 和再轉化天。 但是,我想知道這個 是否適用於所有情況(與日光 保存等)。

如果你的時間是從UTC日期衍生,或者他們只是兩個電話之間在同一系統上測量System.getCurrentTimeMillis()的區別,你會得到毫秒的差別的有效號碼,獨立的任何時區問題。 (這就是爲什麼一切應該使用UTC作爲存儲格式 - 從UTC->當地時間更容易;如果您嘗試以其他方式進行,那麼您需要將本地時區和本地時間一起存儲 - 或試圖推斷它,gack!)

至於把這個變成了幾天,你應該能夠除以86400000 ...與警告,偶爾leap second每隔一年左右。

8

如果你看開源的話,Java的不會錯過太多:嘗試Joda-Time

+3

關於Java日期的問題==>回答提及喬達! – 2009-01-17 14:57:57

0

我與Java沒有一個機制來計算日期之間的差值的要求不以爲然。

Java是爲全球使用而設計的。它的設計使得沒有日期的概念,只有「毫秒時間」的概念。在特定的約定下,對某個特定地點的時間和日期等世界時間的任何解釋都只是一個預測或一個觀點。

日曆類用於將這種絕對時間變成日期。如果您真的需要,也可以添加或減去日期組件。在兩次之間提供組件之間的差異的唯一方法是日曆生成和特定。因此,你可能會爭辯說,標準庫不包括一個足夠聰明的公曆,我同意它留下一些需要。

這就是說,這種功能有很多的實現,我看到其他人提供的例子。

2

隨着date4j庫:

int numDaysBetween = oneDate.numDaysFrom(anotherDate); 
1

還有就是要實現它的簡單方法。我們可以在循環中使用Calendar.add方法。 例如如下,

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 

Date beginDate = dateFormat.parse("2013-11-29"); 
Date endDate = dateFormat.parse("2013-12-4"); 

Calendar beginCalendar = Calendar.getInstance(); 
beginCalendar.setTime(beginDate); 

Calendar endCalendar = Calendar.getInstance(); 
endCalendar.setTime(endDate); 

BEGINDATE日期和結束日期,和下面的代碼之間的負天,

int minusDays = 0; 
while (true) { 
    minusDays++; 

    // Day increasing by 1 
    beginCalendar.add(Calendar.DAY_OF_MONTH, 1); 

    if (dateFormat.format(beginCalendar.getTime()). 
      equals(dateFormat.format(endCalendar).getTime())) { 
    break; 
    } 
} 
System.out.println("The substractation between two days is " + (minusDays + 1)); 

玩得開心! @。@

4

二者必選其一喬達時間或新java.time包中的Java 8

兩個框架使用半開方法,即最開始是包容而結局是獨家。有時標註爲[)。這通常是定義跨度時間的最佳方法。

java.time

的java.time框架構建在Java 8,後來有一個Period類來表示的時間跨度數年,數月,和天數。但是這堂課只限於整整一天,沒有小時,分鐘和秒的表示。

請注意,我們指定一個時區,這對決定日期至關重要。例如,Paris之前的新的一天早於Montréal

ZoneId zoneId = ZoneId.of("America/Montreal"); 
LocalDate now = LocalDate.now(zoneId); 
LocalDate then = LocalDate.of(2001, 1, 1); 
Period period = Period.between(then, now); 

然後:2001-01-01。現在:2015-09-07。期間:P14Y8M6D。天:5362

對於整個日子,然後Daylight Saving Time (DST)是無關緊要的。

如果要計算總天數,請使用包含一些計算方法的ChronoUnit枚舉。注意計算返回很長時間。

long days = ChronoUnit.DAYS.between(then, now); // "5362" seen above. 

I have asked大約在java.time做了充分的時間段,包括小時,分鐘,秒。在Java 8中不可能。使用捆綁的庫was suggestedMeno Hochschild)的一個令人驚訝的解決方法:使用javax.xml.datatype package中的Duration類。

約達時間

以下是在約達時間2.3一些示例代碼。

DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris"); 
DateTime start = new DateTime(2014, 1, 2, 3, 4, 5, timeZone); 
DateTime stop = new DateTime(2014, 5, 2, 3, 4, 5, timeZone); 
Period period = new Period(start, stop); 

調用toString將讓你在由ISO 8601標準,PnYnMnDTnHnMnS規定的形式的字符串表示。