java - 两个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
请帮忙。
解决方案
你的旧方法是正确的。当开始日期晚于结束日期时,它返回 0。您的通话就是这种情况。
您的新方法从开始日期中减去结束日期,这是错误的,应该反过来。我还怀疑它会在夏令时 (DST) 的转换过程中带来惊喜。虽然莫斯科目前不使用夏季时间,但它在历史上一直这样做,至少在 2010 年之前,如果政界人士决定这样做,可能会再次这样做。
也就是说,如果可以避免旧的和过时的日期和时间类DateFormat
、、、和。今天,我们拥有更好的现代 Java 日期和时间 API。当然,在遗留代码中你有老式的对象。在编写新方法时,我建议您将它们转换为现代方法并使用.SimpleDateFormat
Calendar
Date
TimeZone
java.time
Date
LocalDate
ChronoUnit.DAYS.between()
ChronoUnit.DAYS.between(
LocalDate.parse( "2018-06-14" ) ,
LocalDate.parse( "2018-06-06" )
)
-8
请注意,当旧方法设置默认时区时,它会影响在您的 JVM 中运行的所有程序,并且可能会给您程序的其他部分和其他程序带来令人讨厌的惊喜。
推荐阅读
- powershell - 计算这些子文件夹中的子文件夹和 .exe 文件的数量
- python - “经理”没有属性“get_by_natural_key”
- html - 简单的 Streamlabs OBS 文本淡入淡出。淡入不起作用
- python - 为什么有些链接没有从请求标头返回引用者?
- javascript - 当我停止编写它时谁来制作去抖动功能发送请求以获取数据
- c# - 如何使用查询字符串在 C# 中过滤具有多参数的列表视图
- java - 无法访问将类路径发布为 webApp 的嵌入 tomee 的应用程序中的静态 html 资源
- javascript - Javascript验证代码未在函数结束时执行
- python - 迭代路径 + 文件名以创建新的文件对象
- arrays - 拉会话项目后重写数组键