Java,如何在考虑 DST 的同时减去 Date 对象



我有一段代码用于计算两个 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结果;您可以对此结果应用所需的任何舍入。

相关内容

  • 没有找到相关文章

最新更新