为什么Java的Date.getTime()会返回1月份的错误响应?

时间:2012-05-13 04:46:22

标签: java date

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

//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/2012输入localDateInstall,为1/Feb/2012输入localDatePay。结果是: 29天。问题是什么?感谢

3 个答案:

答案 0 :(得分: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);

可悲的是,这在两个方面都是错误的。首先,“年”参数应该是“the year minus 1900”。第二,January is month 0, not month 1。有了这两个日期作为输入,你的确会得到29的答案,因为你实际上要求的是它在3912年2月的天数,这是闰年。

答案 1 :(得分: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);    

答案 2 :(得分:0)

我不认为有足够的信息可以继续,但这里有一些想法。

  1. 您正在执行整数运算,它不会舍入,而是截断一整天。如果您当天的结束时间比开始时间早一点,那么您将失去一整天。

  2. 确保时区没有任何有趣的事情发生。两个日期是以相同的方式输入,还是来自可能有不同时区的不同来源?

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