我有一个问题,我无法以优雅的方式解决。 我需要在Java 8中使用2天之间的日期数(没有JodaTime),但是要整理一天。 代码比我更好解释(日期未被解析)
localDateTime我想知道2015-03-20 / 00:00到2015-04-06 / 00:00之间的区别,但转换到utc更容易看到。
ZoneDateTime startLocalDate="2015-03-19T23:00Z[UTC]";
ZoneDateTime endLocaldate="2015-04-05T22:00Z[UTC]";
Period betweenDates = Period.between( startLocalDate, endLocalDate);
long days = betweenDates.getDays();
16天但实际上是16天23小时(这是正确的)
我可以更改代码,使其全年都能完美添加一小时(plusHours(1))
ZoneDateTime startLocalDate="2015-03-19T23:00Z[UTC]";
ZoneDateTime endLocaldate="2015-04-05T22:00Z[UTC]";
Period betweenDates = Period.between( startLocalDate, endLocalDate.plusHours(1));
long days = betweenDates.getDays();
这会产生我需要报告的17天
还有更优雅的方法吗?
答案 0 :(得分:2)
LocalDate
不会存储时间或时区信息,因此不受DST的影响。如果您有例如ZonedDateTime
作为来源而您只对日期感兴趣,您可以使用toLocalDate()
获取日期。然后您可以获得两个日期之间的天数:
ZonedDateTime dt1 = ZonedDateTime.parse("2015-03-19T23:00Z");
ZonedDateTime dt2 = ZonedDateTime.parse("2015-04-05T22:00Z");
LocalDate startLocalDate = dt1.toLocalDate();
LocalDate endLocalDate = dt2.toLocalDate();
long expectedNumDocuments = ChronoUnit.DAYS.between(startLocalDate, endLocalDate);
System.out.println(expectedNumDocuments); // 17
您还必须使用ChronoUnit.DAYS.between()
代替Period#between()
,因为后者无法获得总天数(尝试使用2015-01-01
和2015-02-02
,{{ 1}}将返回1,而实际上该期间为1个月1天。
答案 1 :(得分:0)
看起来您需要从第A天开始到第B天结束计算。您应该可以使用
进行计算Period.between(startLocalDate,
endLocalDate.plusDays(1).atStartOfDay().toLocalDate());
通过添加一整天,然后回到午夜,您可以避免计算需要添加的小时数。
事实上,你可以跳过atStartOfDay
,因为正如你已经看到的那样,时间会被忽略。这是你的电话。