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中日期的天数差异导致输出错误_Java_Date - Fatal编程技术网

java中日期的天数差异导致输出错误

java中日期的天数差异导致输出错误,java,date,Java,Date,嗨,我正在计算两个日期在几天内的差值。日期是本月14日和今天。应该是2。但o/p始终为0。 代码: o/p: 0 怎么了 现在我做了另一个技巧,它给出了完美的答案不知道上面的代码有什么问题 SimpleDateFormat df = new SimpleDateFormat("dd.mm.yyyy"); long firstdateseconds = df.parse("14.03.2014").getTime(); long today = df.parse("16.0

嗨,我正在计算两个日期在几天内的差值。日期是本月14日和今天。应该是2。但o/p始终为0。 代码:

o/p: 0

怎么了

现在我做了另一个技巧,它给出了完美的答案不知道上面的代码有什么问题

   SimpleDateFormat df = new SimpleDateFormat("dd.mm.yyyy"); 
    long firstdateseconds = df.parse("14.03.2014").getTime();
    long today = df.parse("16.03.2014").getTime();
    long difference = (today-firstdateseconds);
    long days = (long)(difference/(24*3600*1000));
    System.out.println(days);
o/p:2//现在答对了


伙计们,发生了什么事?

使用double当您遇到截断问题时

我使用以下简单代码来完成您想要的:

import java.util.Date;

public class datediff {
    public static void main(String[] args) {

        Date d1 = new Date();
        Date d2 = new Date(2014 - 1900, 2, 14);
        long d1_millis = d1.getTime();
        long d2_millis = d2.getTime();
        long diffMillis = d1_millis - d2_millis;
        long diffDays = diffMillis / (24 * 3600 * 1000);
        System.out.println("Difference in days: " + diffDays);

    }
}
输出:

日差:2


还请注意,计算差值时使用的幻数不正确

要减去的实际值为:1394735400000

这是使用幻数最危险的缺点


希望这能为您澄清问题。

也许是时区和“时间(小时/分钟/秒)”的综合问题

案例一

不同的时区和不同的白天时间:

 public static void main(final String[] args) {

    final Calendar march14 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
    march14.set(2014, Calendar.MARCH, 14, 23, 59, 0);

    final Calendar march16 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo"));
    march16.set(2014, Calendar.MARCH, 16, 0, 0, 0);

    final long diffInMs = march16.getTimeInMillis() - march14.getTimeInMillis();
    System.out.println("diff = " + diffInMs / (24 * 3600 * 1000)+" day(s)");

}
这张照片是:

差异=0天(s)

案例二

但是,调整时区:

public static void main(final String[] args) {

    final Calendar march14 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
    march14.set(2014, Calendar.MARCH, 14, 23, 59, 0);

    final Calendar march16 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii")); // <- CHANGE!
    march16.set(2014, Calendar.MARCH, 16, 0, 0, 0);

    final long diffInMs = march16.getTimeInMillis() - march14.getTimeInMillis();
    System.out.println("diff = " + diffInMs / (24 * 3600 * 1000)+" day(s)");

}
publicstaticvoidmain(最终字符串[]args){
最终日历march14=Calendar.getInstance(TimeZone.getTimeZone(“美国/夏威夷”);
2014年3月14日,3月14日,23日,59日,0日;

最终日历march16=Calendar.getInstance(TimeZone.getTimeZone(“美国/夏威夷”));//你应该试着打印出中间值,看看发生了什么。还有,神奇的数字是什么?@oli:这是一个毫秒的时间戳,对应于3月14日。@MarcB:是的,我假设;)但是我想知道为什么OP会硬编码,而不是简单地显式地构造它。可能是这样的用
difference
除以
int
。如果使用API,就不必担心这样的计算。使用
double
做什么?现在这样做了:longtoday=(new java.util.Date().getTime());double difference=(double)(今天-139480989186.0);double daysdifference=差异/(24*3600*1000);o/p:0.008885162037037037当我在netbeans中使用long时,它表示数字太长了。之所以使用double,是因为有一个除法,如果一天没有过去,它会被截断为0。请检查Javadoc中
Date
构造函数的输入范围……我简化了代码并给出了输出。
public static void main(final String[] args) {

    final Calendar march14 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
    march14.set(2014, Calendar.MARCH, 14, 23, 59, 0);

    final Calendar march16 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii")); // <- CHANGE!
    march16.set(2014, Calendar.MARCH, 16, 0, 0, 0);

    final long diffInMs = march16.getTimeInMillis() - march14.getTimeInMillis();
    System.out.println("diff = " + diffInMs / (24 * 3600 * 1000)+" day(s)");

}
public static void main(final String[] args) {

    final Calendar march14 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
    march14.set(2014, Calendar.MARCH, 14, 0, 0, 0);  // <- CHANGE!

    final Calendar march16 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
    march16.set(2014, Calendar.MARCH, 16, 0, 0, 0);

    final long diffInMs = march16.getTimeInMillis() - march14.getTimeInMillis();
    System.out.println("diff = " + diffInMs / (24 * 3600 * 1000)+" day(s)");

}