我想计算用户的 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/