以天为单位的日期差异将相同的值返回到不同的日期

时间:2016-02-26 17:19:56

标签: java datetime

我有一个代码可以让我从今天到特定日期有所不同。

但我有一个限制:通过日期:2018-10-21,它返回差异-1天。

public static void main(String[] args) {

    diffInDays("2018-10-21T11:22:05.874-02:00[America/Sao_Paulo]"); // 968 : OK!
    diffInDays("2018-10-22T11:22:05.874-02:00[America/Sao_Paulo]"); // 968 <- NOK! Should be: 969
}

public static void diffInDays(String date){
    ZonedDateTime parsedDate = java.time.ZonedDateTime.parse(date, DateTimeFormatter.ISO_ZONED_DATE_TIME);
    ZonedDateTime parseDateTruncateToDays = parsedDate.truncatedTo(ChronoUnit.DAYS);
    ZonedDateTime currentDateZonedDateTime = java.time.ZonedDateTime.now().truncatedTo(ChronoUnit.DAYS);
    long diffInDays = java.time.Duration.between(currentDateZonedDateTime, parseDateTruncateToDays).toDays();
    System.out.println(diffInDays);
}

你有什么理由吗?

2 个答案:

答案 0 :(得分:1)

我不确定为什么它不起作用 - 可能是因为持续时间忽略了DST并且在10月21日或22日有时间变化。

使用更有意义:

return ChronoUnit.DAYS.between(currentDateZonedDateTime, parseDateTruncateToDays);

答案 1 :(得分:0)

我发现了这个问题。

这是因为夏令时。 当你有约会时,比如:

2018-10-22T11:22:05.874-02:00[America/Sao_Paulo]

然后执行:

ZonedDateTime parseDateTruncateToDays = parsedDate.truncatedTo(ChronoUnit.DAYS);

它将转换为:2018-10-22 T01:00:00.000 -02:00 [America / Sao_Paulo]

目前代码将检查日期差异,时间(不考虑夏令时)将在: 2018-10-21T00:00:00.000 -02:00 [美国/ Sao_Paulo]

这就是为什么它总是返回-1天。

要修复它,只需将truncatedTO更改为:

ZonedDateTime parseDateTruncateToDays = parsedDate.truncatedTo(ChronoUnit.HOURS);

然后它将开始考虑计算小时:)