首页 > 解决方案 > 两个java日期之间的区别

问题描述

我提到了生产项目中的一种方法在日期上工作错误,但我不能只是替换它,因为它已经在生产中很长时间了。我创建了一个新方法,它可以正常工作,但我无法弄清楚为什么第一种方法会出错。

旧方法(错误的):

public static Integer getNumberOfDays(Date startDate, Date endDate) {
    TimeZone.setDefault((TimeZone.getTimeZone("Europe/Moscow")));

    startDate.setHours(00);
    startDate.setMinutes(00);
    startDate.setSeconds(00);

    endDate.setHours(23);
    endDate.setMinutes(59);
    endDate.setSeconds(59);

    Calendar cal1 = Calendar.getInstance();
    cal1.setTime(startDate);

    Calendar cal2 = Calendar.getInstance();
    cal2.setTime(endDate);

    Calendar date = (Calendar) cal1.clone();
    int daysBetween = 0;
    while (date.before(cal2)){
        date.add(Calendar.DAY_OF_MONTH, 1);
        daysBetween++;
    }
    return daysBetween;
}

新方法:

public static Integer getNumberOfDaysSecondVersion(Date startDate, Date endDate) {
    long difference = startDate.getTime() - endDate.getTime();
    float daysBetween = (difference / (1000*60*60*24));
    return (int) daysBetween > 0 ? (int) daysBetween : 0;
}

这是我如何称呼两者:

DateFormat formated = new SimpleDateFormat("yyyy-MM-dd");

    System.out.println(Calculation.getNumberOfDays(
            formated.parse("2018-06-14"),
            formated.parse("2018-06-06")
    ));

    System.out.println(Calculation.getNumberOfDaysSecondVersion(
            format.parse("2018-06-14"),
            format.parse("2018-06-06"))
    );

输出:

0
8

请帮忙。

标签: javadate

解决方案


你的旧方法是正确的。当开始日期晚于结束日期时,它返回 0。您的通话就是这种情况。

您的新方法从开始日期中减去结束日期,这是错误的,应该反过来。我还怀疑它会在夏令时 (DST) 的转换过程中带来惊喜。虽然莫斯科目前不使用夏季时间,但它在历史上一直这样做,至少在 2010 年之前,如果政界人士决定这样做,可能会再次这样做。

也就是说,如果可以避免旧的和过时的日期和时间类DateFormat、、、和。今天,我们拥有更好的现代 Java 日期和时间 API。当然,在遗留代码中你有老式的对象。在编写新方法时,我建议您将它们转换为现代方法并使用.SimpleDateFormatCalendarDateTimeZonejava.timeDateLocalDateChronoUnit.DAYS.between()

ChronoUnit.DAYS.between(
    LocalDate.parse( "2018-06-14" ) ,
    LocalDate.parse( "2018-06-06" ) 
)

-8

请注意,当旧方法设置默认时区时,它会影响在您的 JVM 中运行的所有程序,并且可能会给您程序的其他部分和其他程序带来令人讨厌的惊喜。


推荐阅读