2016-02-26 71 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 [美國/聖保羅]

目前的代碼將檢查日期差異,時間(disconsidering夏令時)會得到:2018-10-21T00:00:00.000 -02:00 [美洲/聖保羅]

這就是爲什麼它總是返回-1天。

爲了解決這個問題,只是改變truncatedTO到:

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

然後,它會開始考慮小時計算:)

1

我不知道爲什麼它沒有工作 - 這可能是因爲時間忽略DST且有10月18日

這將更有意義使用的21號或22號的時間變化:

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