我有一段代码用于计算两个 Date 对象之间的天数,在大多数情况下,它工作正常。 但是,如果两个对象之间的日期范围包括三月底,则结果始终比应有的值小 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
作为结果;您可以对此结果应用任何您想要的舍入。
关于Java,如何在考虑 DST 的同时减去日期对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30761682/