2016-02-26 94 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);