需要以天和小时的形式找出两个日期之间的差异

Need to find the difference between two dates in days and hours form

我想找出两个日期之间天数和小时数的差异。我浏览了所有的帖子,大多数帖子只展示了如何在几天内找到它。我的作业要求我们找出天数和小时数的差异

Date date = new Date();
String due_date = DateFormat.format("dd-MMM-yy", getTask.getDueDate()).toString();

long diff = getTask.getDueDate().getTime() - date.getTime();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;

我已经完成了上面的编码。截止日期是通过日期选择器设置的,日期是当前日期和时间。我想要他们,例如,我将截止日期设置为 21-11-2019 00:00:00,我当前的日期和时间是 21-11-2019 07:00:00,结果为“0 days 7”小时'。

您已经计算了日期和时间。您需要做的就是打印如下内容:

System.out.println(days + " days " + (hours % 24) + " hours");

如果你以前没见过,% 是模数运算符。它给你除法后的余数。

java.time 和 ThreeTenABP

编辑:根据新信息修改了代码,并进行了冒烟测试。

the due date can be today or in the future.

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MMM-uu", Locale.ROOT);
    ZoneId zone = ZoneId.systemDefault();

    ZonedDateTime now = ZonedDateTime.now(zone);
    String dueDateString = "01-Dec-19";

    LocalDate dueDate = LocalDate.parse(dueDateString, dateFormatter);
    LocalDate today = now.toLocalDate();
    if (dueDate.equals(today)) {
        System.out.println("Due date is today");
    } else {
        // Count days from tomorrow and then hours until start of day tomorrow
        LocalDate tomorrow = today.plusDays(1);
        long days = ChronoUnit.DAYS.between(tomorrow, dueDate);

        ZonedDateTime startOfDayTomorrow = tomorrow.atStartOfDay(zone);
        long hours = ChronoUnit.HOURS.between(now, startOfDayTomorrow);

        System.out.println("Due date will be in " + days + " days " + hours + " hours");
    }

当我运行刚才的代码在我的时区(Europe/Copenhagen)时,输出是:

Due date will be in 1 days 2 hours

我不确定这是否是您想要的确切输出,但我希望您可以调整代码以提供您想要的结果。

对于 API 级别 26 以下的 Android,将 ThreeTenBackport 库添加到您的项目中,并确保使用子包从 org.threeten.bp 导入日期和时间 类。

请根据日期字符串的语言为格式化程序提供正确的语言环境。

Date, DateFormatSimpleDateFormat 都设计得很差而且已经过时了, java,time, modern Java 日期和时间 API,使用起来更方便。此外,您不应该根据毫秒手动计算天数和小时数。它比您在代码中所做的更复杂,容易出错且难以阅读。依靠成熟的库方法来完成这样的任务。

原代码:

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd-MMM-uu", Locale.ROOT);
    ZoneId zone = ZoneId.systemDefault();

    ZonedDateTime now = ZonedDateTime.now(zone);
    String dueDateString = "20-Nov-19";

    LocalDate dueDate = LocalDate.parse(dueDateString, dateFormatter);
    long days = ChronoUnit.DAYS.between(dueDate, now.toLocalDate());

    ZonedDateTime startOfToday = now.toLocalDate().atStartOfDay(zone);
    long hours = ChronoUnit.HOURS.between(startOfToday, now);

    System.out.println("Due date was " + days + " days " + hours + " hours ago");

问题:java.time 不需要 Android API 26 级吗?

java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置现代 API。
  • 非Android Java 6 和 7 获得 ThreeTen Backport,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接