在Java 8中包含夏令时期间的周期(舍入日)

时间:2015-10-07 12:28:34

标签: java

我有一个问题,我无法以优雅的方式解决。 我需要在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天

还有更优雅的方法吗?

2 个答案:

答案 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-012015-02-02,{{ 1}}将返回1,而实际上该期间为1个月1天。

答案 1 :(得分:0)

看起来您需要从第A天开始到第B天结束计算。您应该可以使用

进行计算
Period.between(startLocalDate, 
               endLocalDate.plusDays(1).atStartOfDay().toLocalDate());

通过添加一整天,然后回到午夜,您可以避免计算需要添加的小时数。

事实上,你可以跳过atStartOfDay,因为正如你已经看到的那样,时间会被忽略。这是你的电话。