2

以毫秒为单位计算日期的代码是:

//installment date converted to milliseconds
long localDateInstall = installDate.getTime();

//installment date converted to milliseconds
long localDatePay = payDate.getTime();

在这里我计算这些日期之间的天数:

days=Math.abs((localDatePay - localDateInstall))/86400000;

当我想测试它时,我输入1/Jan/2012forlocalDateInstall1/Feb/2012for localDatePay。结果是:29 天。问题是什么?谢谢

4

3 回答 3

13

反例:

public static void main(String[] args) throws Exception {
    SimpleDateFormat format = new SimpleDateFormat("d MMM yyyy");
    Date installDate = format.parse("1 Jan 2012");
    Date payDate = format.parse("1 Feb 2012");
    long localDatePay = payDate.getTime();
    long localDateInstall = installDate.getTime();
    long days = Math.abs(localDatePay - localDateInstall) / 86400000;
    System.out.println(days);
}

这工作正常,输出为“31”,正如预期的那样。问题出在你没有告诉我们的地方。在黑暗中射击:您可能正在构建您的测试输入,如下所示:

Date installDate = new Date(2012, 1, 1);
Date payDate = new Date(2012, 2, 1);

可悲的是,这在两个方面是错误的。首先,“年份”参数应该是“年份减去 1900 ”。其次,一月是第 0 个月,而不是第 1 个月。使用这两个日期作为输入,您确实会得到 29 的答案,因为您实际上是在询问 3912 年 2 月的天数,这是闰年。

于 2012-05-13T04:57:18.883 回答
0

你可以试试:

//installment date converted to milliseconds
long localDateInstall=installDate.getTimeInMillis();

//installment date converted to milliseconds
long localDatePay=payDate.getTimeInMillis();

long diff = localDatePay-localDateInstall;

long diffInDays = diff / (24 * 60 * 60 * 1000);    
于 2012-05-13T05:00:25.553 回答
0

我认为没有足够的信息继续下去,但这里有一些想法可以追求。

  1. 您正在执行整数运算,它不会四舍五入,而是截断任何短于一整天的东西。如果您一天中的结束时间比开始时间早一点,您将失去一整天。

  2. 确保时区没有有趣的事情发生。这两个日期是否以相同的方式输入,或者它们是否来自可能附加不同时区的不同来源?

  3. 如果您发布每个的实际毫秒值以及您的预期时区,则应该很容易确定两者中的哪一个关闭。

于 2012-05-13T05:37:52.233 回答