【问题标题】:Getting days between current date and other date in Java [duplicate]在Java中获取当前日期和其他日期之间的天数[重复]
【发布时间】:2017-10-12 19:26:35
【问题描述】:

我需要一个方法来返回当前日期和其他任何日期之间的天数差异,我有以下内容:

private long getDays(Date dateOp) {
    Calendar feCurrent=Calendar.getInstance();
    feCurrent.set(Calendar.HOUR_OF_DAY, 0);
    feCurrent.set(Calendar.MINUTE, 0);
    feCurrent.set(Calendar.SECOND, 0);

    Calendar feAna=Calendar.getInstance();
    feAna.setTime(dateOp);
    feAna.set(Calendar.HOUR_OF_DAY, 0);
    feAna.set(Calendar.MINUTE, 0);
    feAna.set(Calendar.SECOND, 0);
    feAna.getTime());
    long timeDiff = Math.abs(feAna.getTime().getTime() - feCurrent.getTime().getTime());

    return TimeUnit.MILLISECONDS.toDays(timeDiff);
}

问题是我总是少一天,例如,如果作为参数的日期是 2017 年 10 月 16 日,结果将是 3,但实际上是 4,我调试了这些日期的 timeDiff 是 345599395 ,当转换为天数是 3.999....

有谁知道为什么它不起作用。

顺便说一下,日期作为参数是从数据库加载的,因为如果我尝试使用主要设置两个日期都可以。

【问题讨论】:

  • feAna.set(Calendar.MILLISECOND, 0)
  • 尝试将两个日历实例的毫秒数设置为0cal.set(Calendar.MILLISECOND, 0)
  • 另外,如果夏令时在两个日期之间开始,这种通用方法将失败,因为会有一天只有 23 小时,这会打乱划分。
  • 请注意,CalendarDate 类是旧日期 API 的一部分,现在已成为旧版。而是使用包 java.time 中的新 API 的类。
  • 谢谢,我设置了毫秒,它起作用了,我不会遇到夏令时问题,因为我的国家不使用它们

标签: java date date-difference


【解决方案1】:

如果你使用 Java 8,你可以使用 java.time 组件

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

final class PeriodTest {

    public static void main(String[] args) {
        LocalDate now = LocalDate.of(2017, 4, 4); // 2017-04-04
        LocalDate otherDate = LocalDate.of(2015, 10, 23); // 23-10-2015
        long days = Math.abs(ChronoUnit.DAYS.between(otherDate, now));

        System.out.println("Days = " + days);
    }
}

输出

Days = 529

优点:

  • 您不必玩旧的Calendar 对象
  • 您可以使用 Date.toInstant() 方法将 java.util.Date 转换为 java.time.Instant 以使其与当前示例一起使用

Java 6 解决方案

对于 Java 6,您可以使用 Joda-Time,它是 Java 8 Time API 的前身。

import org.joda.time.Days;
import org.joda.time.LocalDate;

final class PeriodTest {

    public static void main(String[] args) {
        LocalDate now = LocalDate.parse("2017-04-04");
        LocalDate otherDate = LocalDate.parse("2015-10-23");

        int days = Math.abs(Days.daysBetween(now, otherDate).getDays());

        System.out.println("Days = " + days);
    }
}

【讨论】:

  • "作为参数的日期是从数据库中加载的"
  • @Arkadiy java.util.Date 可以通过Date.toInstant() 方法轻松转换为java.time.Instant
  • 您能否显示用于Date 对象表示的日期的代码? OP:“如果我在两个日期都尝试使用主要设置,它可以工作”
  • 非常感谢,我以前用过这个,但不幸的是这个应用程序适用于 Java 6,并且它受到外部库的限制,所以只有我有
  • @Arkadiy 添加了一个使用java.util.Date的示例
猜你喜欢
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
相关资源
最近更新 更多