我有一段代码用于计算两个 Date 对象之间的天数,在大多数情况下,它工作正常。但是,如果两个对象之间的日期范围包括 3 月底,则结果始终比应有的值少 1。例如,2014 年 3 月 31 日 - 2014 年 3 月 29 日 = 1,而它应该是 2。
我知道这是因为 3 月 30 天有 24 小时,1 天有 23 小时,这是该值少 1 的原因。
但是,我不确定解释缺失时间的最佳方法。
// This was what I have initially
int numDays = (int) ((dateTo.getTime() - dateFrom.getTime()) / (1000 * 60 * 60 * 24));
// I have tried rounding, since it should have 23 hours left over, but it didn't actually work.
int numDays = (Math.round(dateTo.getTime() - dateFrom.getTime()) / (1000 * 60 * 60 * 24));
任何帮助/指示将不胜感激。
我必须使用Java 7,不幸的是我无法使用Jodatime。
你的第二个例子非常接近。不过,你的括号Math.round()
只围绕减法,所以既然这已经是一个整数(嗯,真的是一个long
),所以什么也没发生,然后你除法。第二位代码的另一个问题是你正在执行整数除法,它总是截断小数点之后的部分。试试这个:
long numDays2 = Math.round((dateTo.getTime() - dateFrom.getTime()) / (1000.0 * 60 * 60 * 24));
(如前所述,我更改了Math.round()
参数,并通过使除数成为double
来使其成为浮点除法。
但是,正如评论所示,这是一个黑客。特别是,它会告诉您 3 月 5 日上午 6 点到 3 月 6 日晚上 8 点之间有两天。这可能不是你想要的。试试这个尺寸:
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.setTime(fmt.parse("2014-03-29"));
long start = cal.getTimeInMillis();
start += cal.getTimeZone().getOffset(start);
cal.setTime(fmt.parse("2014-03-31"));
long end = cal.getTimeInMillis();
end += cal.getTimeZone().getOffset(end);
System.out.println((end - start)/86400000.0);
丑吗?是的。很奇怪吗?是的。行得通吗?是的(我想是的)。请注意,我提供了一个double
结果;您可以对此结果应用所需的任何舍入。