2016-02-26 2 views
0

У меня есть код, который дает мне разницу в дни от сегодняшнего дня до определенной даты.Дата разницы в днях возвращает то же значение в разные даты

Но у меня есть предел: передача даты: 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); 
} 

У вас есть идеи по причине этого?

ответ

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 [Америка/Sao_Paulo]

на данный момент код будет проверять дату диф, время (disconsidering в летнее время) получат по адресу: 2018-10-21T00: 00: 00,000 -02: 00 [Америка/Sao_Paulo ]

Вот почему он всегда возвращает -1 день.

Чтобы исправить это, просто измените truncatedTO на:

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

Затем он приступит к рассмотрению час для расчета :)

1

Я не знаю, почему он не работает - возможно, потому, что продолжительность игнорировали DST и есть изменение времени на 21-м или 22-18 октября

Было бы больше смысла использовать:

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