【问题标题】:How I can get number of days between two dates including time? [duplicate]如何获取两个日期之间的天数,包括时间? [复制]
【发布时间】:2018-04-12 17:34:50
【问题描述】:

如何获取两个日期之间的天数,包括时间。例如,今天晚上 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;
}

【问题讨论】:

  • 请告诉我们这是哪个“日期”类。 java.util.Date 还是 java.sql.Date?
  • @TheImpaler 有关系吗? java.sql.Date 扩展了 java.util.Date 并且他使用的 getTime 没有被 java.sql.Date 超载。
  • 嘿@Lothar。放松,伙计。 TGIT!
  • 是的,@Lothar 是对的。虽然 TimeUnit 对我有用

标签: java android


【解决方案1】:

使用TimeUnit:

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

【讨论】:

  • 尝试使用日期为 2018-03-24 03:01:00 和 2018-03-25 03:02:00(使用欧洲/柏林时区)的方法。您的方法将返回 0
  • 零是正确的,因为只过去了 23 小时 1 分钟。
  • @TheImpaler 不是“两个日期之间有多少天”的常规含义。
【解决方案2】:

您的计算(以及答案之一中的实现)仅适用于在不知道夏令时的时区中运行的系统。例如德国时区(我居住的地方),2018-03-24 03:00:002018-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++;
        }
    }
}

【讨论】:

    【解决方案3】:

    使用Joda Time 执行此操作。

    public void calcDays(Date start,Date end) {
    
            Duration d = new Duration(start.getTime(), end.getTime());
    
    
            System.out.println("Number of days from dates "+d.getStandardDays());
    }
    

    Duration 是来自 JodaTime 的类

    【讨论】:

    • 请注意,JodaTime 不是 JDK 的一部分,而是一个外部 Java 库。
    • 好的,我试试这个。谢谢
    【解决方案4】:

    假设您使用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。

    【讨论】:

      猜你喜欢
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      相关资源
      最近更新 更多