Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java';s Date.getTime()返回的一月响应不正确?_Java_Date - Fatal编程技术网

为什么Java';s Date.getTime()返回的一月响应不正确?

为什么Java';s Date.getTime()返回的一月响应不正确?,java,date,Java,Date,以毫秒为单位计算日期的代码为: //installment date converted to milliseconds long localDateInstall = installDate.getTime(); //installment date converted to milliseconds long localDatePay = payDate.getTime(); 这里我计算了两个日期之间的天数: days=Math.abs((localDatePay - localDate

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

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

//installment date converted to milliseconds
long localDatePay = payDate.getTime();
这里我计算了两个日期之间的天数:

days=Math.abs((localDatePay - localDateInstall))/86400000;
当我想测试它时,我为
localDateInstall
输入
1/Jan/2012
,为
localDatePay
输入
1/Feb/2012
。结果是:29天。有什么问题?谢谢

反例:

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);
不幸的是,这在两个方面是错误的。首先,“年”的论点应该是“年”。第二将这两个日期作为输入,您确实会得到29的答案,因为您实际上是在询问3912年2月的天数,这是闰年。

您可以尝试:

//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);    

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

  • 您正在执行整数运算,它不会取整,而是截断短于一整天的任何内容。如果你一天的结束时间比开始时间早一点,你就会损失一整天

  • 确保时区没有发生有趣的事情。这两个日期是以相同的方式输入的,还是来自可能附加了不同时区的不同来源

  • 如果您发布了每一个的实际毫秒值,以及您预期的时区,那么很容易确定这两个值中的哪一个是关闭的


  • 在您用来将这些日期映射到时间点的时区中,1月1日和2月1日之间是否会有夏令时调整?换言之,2012年1月该时区的任何一天都不是24小时吗?演示如何使用Joda time获取两个日期之间的天数。
    getTime()
    仅提供UTC的长时间戳我同意Mike的说法。它没有理由给你错误的值。如果你做的一切都是对的,DST可能是唯一可能的原因。夏令时(美国)于2012年3月11日(星期日)开始。1月1日和2月1日之间没有变化。除了不计算差异的绝对值外,这与已经发生的事情有什么不同?它计算的是1月份的天数,不应该受到闰年的影响。@phatfingers:再看一次我写的(下半部分)。哇,很对。我收回我的评论(并将对你的条目进行投票)。@NargesSalehnia:这不是一个很有帮助的评论。如果这是您问题的解决方案,请单击答案左侧的复选标记,将其标记为“已接受”。如果没有,请发布您自己的答案,解释问题的真正原因。我正在做这个dateTimeString=“2014-12-03 04:25:00”
    SimpleDataFormat SimpleDataFormat=new SimpleDataFormat(“yyyy-MM-dd H:m:s”,Locale.getDefault());Date Date=SimpleDataFormat.parse(dateTimeString);startTimeInMillis=date.getTime()日期.getTime返回毫秒,即12月2日