【问题标题】:Days difference in dates in java giving wrong outputjava中日期的天差给出错误的输出
【发布时间】:2014-03-16 15:15:37
【问题描述】:

您好,我正在尝试计算两个日期的天数之差。日期是本月 14 日和今天。它应该是 2。但 o/p 始终为 0。 代码:

    long today = (new java.util.Date().getTime());
    long difference =(long) (today - 1394809789186.0);
    long daysdifference = difference/(24*3600*1000);
    System.out.println(daysdifference);

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 // 现在是正确的宾果游戏!

大家怎么了?

【问题讨论】:

  • 您应该尝试打印出中间值以查看发生了什么。另外,1394809789186.0 的神奇数字是什么?
  • @oli:这是一个毫秒时间戳,对应于 3 月 14 日。
  • @MarcB:是的,我认为是 ;) 但我想知道为什么 OP 有这样的硬编码,而不是简单地明确地构造它。
  • 可能是由difference 除以int 引起的。
  • 如果您使用Joda-Time API,您将永远不必担心此类计算。

标签: java date


【解决方案1】:

我使用下面的简单代码来完成你想要的:

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

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

希望能为你澄清事情。

【讨论】:

  • 请检查Javadoc中Date构造函数的输入范围...
  • 我已经简化了代码并给出了输出。
【解决方案2】:

可能是TimeZone 和“时间(小时/分钟/秒)”的组合问题?

案例一

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

 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 天

案例二

但是,调整时区:

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

}

这打印:

差异 = 1 天

案例三

并调整时间(小时/分钟/秒):

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

}

打印出来:

差异 = 2 天

结论

我的两个建议:

  • 不要使用幻数,设置日期/日历对象的所有相关部分
  • 使用日期/时间时始终设置TimeZone

SimpleDateFormat 的附加说明

顺便说一句:SimpleDateFormat m 表示分钟,M 表示一年中的月份,请参阅http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html。你的计算结果是2,这完全是随机的。

【讨论】:

    【解决方案3】:

    使用双精度会遇到截断问题

    【讨论】:

    • 使用double 做什么?
    • 现在这样做了:long today = (new java.util.Date().getTime());双差=(双)(今天 - 1394809789186.0);双天差=差/(24*3600*1000); o/p : 0.008885162037037037
    • 当我使用 long 时,它说 netbeans 中的数字太长.. 所以使用 double
    • 因为有除法,没有经过一天就截断为0。
    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2019-05-12
    相关资源
    最近更新 更多