Java 如何获得两个日期之间的天数(包括时间)?

Java 如何获得两个日期之间的天数(包括时间)?,java,android,Java,Android,如何获得两个日期之间的天数,包括时间。例如,从今天晚上8点到另一天晚上8点之间的天数?我正在使用这个,但它是根据月份的日期给出的 public static int getDaysTillOmer(Date d1, Date d2) { int daysdiff = 0; long diff = d2.getTime() - d1.getTime(); long diffDays = diff / (24 * 60 * 60 * 1000); daysdiff =

如何获得两个日期之间的天数,包括时间。例如,从今天晚上8点到另一天晚上8点之间的天数?我正在使用这个,但它是根据月份的日期给出的

public static int getDaysTillOmer(Date d1, Date d2) {
    int daysdiff = 0;
    long diff = d2.getTime() - d1.getTime();
    long diffDays = diff / (24 * 60 * 60 * 1000);
    daysdiff = (int) diffDays;

    return daysdiff;
}

使用
时间单位

public static int getDaysTillOmer(Date d1, Date d2) {
    long diff = d2.getTime() - d1.getTime();
    return TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);

使用
时间单位

public static int getDaysTillOmer(Date d1, Date d2) {
    long diff = d2.getTime() - d1.getTime();
    return TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
用它来做

Duration
是来自JodaTime的类

使用do it


Duration
是来自JodaTime的类

假设您使用的是
java.util.Date
您的算法非常好。我会稍微打扫一下

import java.util.Date;

public static int getDaysTillOmer(Date d1, Date d2) {
    long diffDays = (d2.getTime() - d1.getTime()) / (24L * 60 * 60 * 1000);
    return (int) diffDays;
}
此逻辑将天数截断为整数值。即2天、23小时和59分钟的时差将转换为:2天


另外,请注意值
24
已转换为
24L
,以防止升级为long。

假设您使用的是
java.util.Date
,那么您的算法非常好。我会稍微打扫一下

import java.util.Date;

public static int getDaysTillOmer(Date d1, Date d2) {
    long diffDays = (d2.getTime() - d1.getTime()) / (24L * 60 * 60 * 1000);
    return (int) diffDays;
}
此逻辑将天数截断为整数值。即2天、23小时和59分钟的时差将转换为:2天

另外,请注意值
24
已转换为
24L
,以防止升级为long。

您的计算(以及其中一个答案中的实现)仅适用于在不知道夏令时的时区中运行的系统。例如,德国时区(我居住的地方),
2018-03-24 03:00:00
2018-03-25 03:00:00
的持续时间,我想你希望有一天会遇到唯一的问题,那一天只有23小时

如果您想坚持使用JVM提供的标准类,那么可以使用日历并日复一日地添加到其中,直到基础日期在第二个日期之后。下面是一个例子(没有健全性检查,例如,第一个日期实际上早于第二个日期;在另一种情况下,您将遇到无休止的循环)。该示例设置了要显式使用的时区,因此它也应该在您的系统上显示相同的结果:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class CalcDuration {

    public final static void main(String[] args) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
        Date d1 = sdf.parse("2018-03-24 03:00:00");
        Date d2 = sdf.parse("2018-03-25 03:00:00");

        System.out.println("duration1: " + getDuration(d1, d2));
    }

    private static int getDuration(Date d1, Date d2) {
        Calendar c = Calendar.getInstance();
        c.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
        c.setTime(d1);
        int days = 0;
        while (true) {
            c.add(Calendar.DAY_OF_YEAR, 1);
            if (c.getTime().after(d2)) {
                return days;
            }
            days++;
        }
    }
}
您的计算(以及其中一个答案中的实现)仅适用于在不知道夏令时的时区中运行的系统。例如,德国时区(我居住的地方),
2018-03-24 03:00:00
2018-03-25 03:00:00
的持续时间,我想你希望有一天会遇到唯一的问题,那一天只有23小时

如果您想坚持使用JVM提供的标准类,那么可以使用日历并日复一日地添加到其中,直到基础日期在第二个日期之后。下面是一个例子(没有健全性检查,例如,第一个日期实际上早于第二个日期;在另一种情况下,您将遇到无休止的循环)。该示例设置了要显式使用的时区,因此它也应该在您的系统上显示相同的结果:

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class CalcDuration {

    public final static void main(String[] args) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
        Date d1 = sdf.parse("2018-03-24 03:00:00");
        Date d2 = sdf.parse("2018-03-25 03:00:00");

        System.out.println("duration1: " + getDuration(d1, d2));
    }

    private static int getDuration(Date d1, Date d2) {
        Calendar c = Calendar.getInstance();
        c.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
        c.setTime(d1);
        int days = 0;
        while (true) {
            c.add(Calendar.DAY_OF_YEAR, 1);
            if (c.getTime().after(d2)) {
                return days;
            }
            days++;
        }
    }
}

请注意,JodaTime不是JDK的一部分,而是一个外部Java库。谢谢请注意,但是JodaTime不是JDK的一部分,而是一个外部Java库。谢谢,请告诉我们这节课是哪节课。java.util.Date还是java.sql.Date?@这个名字有关系吗
java.sql.Date
扩展了
java.util.Date
,他使用的
getTime
没有被
java.sql.Date
重载。放松点,伙计。TGIT!是的,洛萨是对的。时间单位对我来说很有用,但请告诉我们这是哪门“日期”课。java.util.Date还是java.sql.Date?@这个名字有关系吗
java.sql.Date
扩展了
java.util.Date
,他使用的
getTime
没有被
java.sql.Date
重载。放松点,伙计。TGIT!是的,洛萨是对的。考虑到您的方法,时间单位对我有效,日期为2018-03-24 03:01:00和2018-03-25 03:02:00(欧洲/柏林时区)。您的方法将返回
0
。零是正确的,因为只经过了23小时零1分钟。@该标记不是“两个日期之间有多少天”的常规含义。请使用日期2018-03-24 03:01:00和2018-03-25 03:02:00(时区为欧洲/柏林)尝试您的方法。您的方法将返回
0
。零是正确的,因为只经过了23小时零1分钟。@该符号不是“两个日期之间有多少天”的常规含义。