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

Java 需要以天和小时的形式找出两个日期之间的差异,java,android-studio,hour,date-difference,Java,Android Studio,Hour,Date Difference,我想找出两个日期之间在天数和小时上的差异。我浏览了所有的帖子,大多数的帖子只展示了如何在几天内找到它。我的任务要求我们找出天数和小时的差异 Date date = new Date(); String due_date = DateFormat.format("dd-MMM-yy", getTask.getDueDate()).toString(); long diff = getTask.getDueDate().getTime() - date.getTime(); long second

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

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;

我已经完成了上面的编码。到期日期通过日期选择器设置,日期为当前日期和时间。例如,我将截止日期设置为2019年11月21日00:00:00,当前日期和时间为2019年11月21日07:00:00,结果为“0天7小时”

您已经计算了天数和小时数。您只需打印以下内容:

System.out.println(days + " days " + (hours % 24) + " hours");
如果您以前没有见过它,
%
是模运算符。它给出除法后的余数。

java.time和ThreeTenABP 编辑:修改新信息后的代码,并测试烟雾

到期日可以是今天或将来

当我刚刚在我的时区(欧洲/哥本哈根)运行代码时,输出是:

截止日期为1天2小时

我不确定这是否是您想要的确切输出,但我希望您可以调整代码以满足您的需要

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

请根据日期字符串的语言为格式化程序提供正确的区域设置

Date
DateFormat
SimpleDateFormat
都设计得很差,而且早已过时,而java、time,现代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吗? time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
  • 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
  • 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
    org.threeten.bp
    导入日期和时间类
链接
  • 解释如何使用java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

截止日期可以是(1)过去(2)今天和(3)将来吗?@Ole V.V.截止日期可以是今天或将来。非常感谢,我一直在寻找一个非常简单的解决方案,这实际上对我的作业有效。没问题。你能投票接受答案吗?我试过了,这也奏效了。谢谢你向我推荐这个方法!
    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");