2017-09-05 162 views
1

有關的startDate和結束日期在一個月的天數如下我怎麼determin期間的月和日(還剩下什麼呢):在java的日期和LocalDateTime

String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; 
SimpleDateFormat format = new SimpleDateFormat(pattern); 
Date start = format.parse("2016-11-09T02:00:00.000Z"); 
Date end = format.parse("2017-09-30T09:00:00.000Z"); 

因此,我想:10個月和22天(結束日期)

+0

簡單分割問題'end.getTime() - start.endTime()/秒天數** **但是**一個月是多少?多少天? –

+2

如果你的環境是'Java 8',那麼你可以考慮使用['LocalDateTime'](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html),它是java更好的日期時間API。您可以使用['ChronoUnit'](https://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoUnit)來計算介於兩者之間,介於兩者之間的小時數以及是甚至一個月的天數。 html) – KarelG

+0

@KarelG一個例子? –

回答

5

如果你可以使用Java 8,最好是使用LocalDateTimePeriod

ZonedDateTime dateTime = ZonedDateTime.parse("2016-11-09T02:00:00.000Z"); 
ZonedDateTime end = ZonedDateTime.parse("2017-09-30T09:00:00.000Z"); 
System.out.println(Period.between(dateTime.toLocalDate(),end.toLocalDate())); 

結果是P10M21D 10個月和21天

+0

如果結束與開始之間的差異超過一年,則無法給出正確的月數。你需要計算12個月的月數*。所以不要直接使用月份。 – nagendra547

+0

@ nagendra547,我不太清楚,如果我理解你。 '期限'應顯示正確的月份。 'System.out.println(Period.between(LocalDate.parse(「1987-10-05」),LocalDate.now()));'29年11個月。 –

+0

我認爲@ nagendra547告訴* 29年和11個月*應該返回* 359個月*。但是OP沒有具體說明當差值> 12個月時結果應該如何,所以兩者都是正確的IMO。 – 2017-09-05 11:45:18

0

此代碼應該適合您。這是通過使用JODA Time完成的。正如你用jodatime標記這個問題,所以我相信,你將需要包含你的項目中包含的jodatime包。

String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; 
SimpleDateFormat format = new SimpleDateFormat(pattern); 
Date start = format.parse("2016-11-09T02:00:00.000Z"); 
Date end = format.parse("2017-09-30T09:00:00.000Z"); 

LocalDate a = LocalDate.fromDateFields(start); 
LocalDate b = LocalDate.fromDateFields(end); 
Period p = new Period(a, b); 
System.out.println("Months: "+((p.getYears() * 12) + p.getMonths())); 
System.out.println("Days: "+(p.getWeeks()*7+ p.getDays())); 

但是,如果您使用的是Java 8.0或更高版本,則可以使用@Anton建議的解決方案。