java - 如何计算两次之间的差异

标签 java android date calendar

我想计算用户的 sleep 时间,他应该输入他 sleep 的时间和他醒来的时间,我应该计算他睡了多少小时

例如,如果用户输入

他的 sleep 时间:晚上 11:00

他的起床时间:早上 7:30

sleep 时间应为:8:30

有什么办法可以很容易地进行这个计算

这是代码

cal.set(Calendar.HOUR_OF_DAY, 11);
        cal.set(Calendar.MINUTE, 0);
        sleepTimeOnOffDays = cal.getTime();

    private long subtractTwoDates(Date date1, Date date2) {

            Calendar calendar1 = Calendar.getInstance();
            Calendar calendar2 = Calendar.getInstance();
            calendar1.setTime(date1);
            calendar2.setTime(date2);
            long milsecs1 = calendar1.getTimeInMillis();
            long milsecs2 = calendar2.getTimeInMillis();
            long diff = milsecs2 - milsecs1;
            long dhours = diff / (60 * 60 * 1000);

            return Math.abs(dhours);
        }

最佳答案

从 Java SE 8 开始,我建议使用 java.time应用程序接口(interface)。对于安卓用户,java.time 添加在API 26+中.

Java 8 为日期和时间引入了新的 API,以解决旧的 java.util.Date 和 java.util.Calendar 的缺点。

使用 java.time API 计算 2 个日期时间之间的持续时间非常简单。

LocalDateTime localDateTime1 = LocalDateTime.now();
localDateTime1 = localDateTime1.withHour(23).withMinute(0).withSecond(0).withNano(0);

LocalDateTime localDateTime2 = LocalDateTime.now();
localDateTime2 = localDateTime2.plusDays(1).withHour(7).withMinute(30).withSecond(0).withNano(0);

Duration diff = Duration.between(localDateTime1, localDateTime2);

String hms = String.format("%d:%02d:%02d", 
                 diff.toHoursPart(),
                 diff.toMinutesPart(), 
                 diff.toSecondsPart());
System.out.println(hms);

-----------------------

Console output:
8:30:00

如果 java.time API 不适用于您的项目,例如因为您的项目尚未达到 API 级别 26,那么我建议使用 ThreeTen Android Backport @Ole V.V 在下面的评论中建议的 API。

语法与 java.time API 几乎相同。上面的代码 fragment 也适用于 ThreeTen Android Backport API(就像已经提到的@Basil Bourque),但有一个异常(exception)。不幸的是,ThreeTen Android Backport API 的 Duration 类没有提供从持续时间对象中提取小时部分、分钟部分等的辅助方法。相反,当您使用反向端口时,您需要先减去小时数,然后从持续时间中减去分钟数,因此只剩下秒数:

long hours = diff.toHours();
diff = diff.minusHours(hours);
long minutes = diff.toMinutes();
diff = diff.minusMinutes(minutes);
long seconds = diff.getSeconds();
String hms = String.format("%d:%02d:%02d", 
                 hours,
                 minutes, 
                 seconds);

另一个区别是您需要从 org.threeten.bp 包(而不是 java.time 包)导入 java.time 类。

如果您想使用 ThreeTen Backport API,只需包含它的 dependency到您的项目。

关于java - 如何计算两次之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54388729/

相关文章:

java - 具有小输入集的 java 中的堆栈溢出错误

java - Android 和其他 java 应用程序之间的预共享 key 安全吗?

java - 检查是否在 Parse 数据库中找到用户名和电子邮件

c# - 通过 DateTime 对象仅从 Controller 传递日期。尝试多种方式绑定(bind)时间

java自动发送邮件

java - AlertDialog 不会关闭

java - 图层列表上的右下角为黑色

javascript - 获取两个日期对象之间的小时差?

Phpexcel 得到错误的日期

java - PagingAndSortingRepository如何实现PostFilter?