2017-09-05 99 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建议的解决方案。