Java 如何计算两次之间的差值

Java 如何计算两次之间的差值,java,android,date,calendar,Java,Android,Date,Calendar,我想计算用户的睡眠时间,他应该输入他睡觉的时间和醒来的时间,我应该计算他睡了多少小时 例如,如果用户输入 他的睡眠时间:晚上11:00 他的起床时间:上午7:30 睡眠时间应为:8:30小时 有什么方法可以使这个计算变得容易吗 这是密码 cal.set(Calendar.HOUR_OF_DAY, 11); cal.set(Calendar.MINUTE, 0); sleepTimeOnOffDays = cal.getTime(); private lo

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

例如,如果用户输入

他的睡眠时间:晚上11:00

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

睡眠时间应为: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);
        }

您可以使用
SimpleDataFormat
获取输入。我使用的是预定义的输入,因为您需要计算两个给定时间之间的差值。这是你的密码。请注意,我已经给出了24小时或12小时格式的答案

获取睡眠时间和起床时间的价值

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
Date sleepingTime = simpleDateFormat.parse("22:00");
Date wakeUptime = simpleDateFormat.parse("07:00");
//days and minutes are optional
int days = (int) (difference / (1000*60*60*24));  
int hours = (int) ((difference - (1000*60*60*24*days)) / (1000*60*60)); 
int min = (int) (difference - (1000*60*60*24*days) - (1000*60*60*hours)) / 
(1000*60);
Log.e("log_tag",hours+" hours"); 
如果差值小于零,则以12小时格式发生

long difference = sleepingTime.getTime() - wakeUpTime.getTime(); 
if(difference<0) {
  Date dateMax = simpleDateFormat.parse("24:00");
  Date dateMin = simpleDateFormat.parse("00:00");
  difference=(dateMax.getTime() -sleepingTime.getTime() )+(wakeUpTime.getTime()- 
  dateMin.getTime());
}

我希望它能回答你的问题。谢谢:)

只需尝试以下代码行即可在几分钟内获得差异

import java.util.concurrent.TimeUnit; // predefined method from java 6.

  private long subtractTwoDates(Date date1, Date date2) {
    Long diffInMinutes=null,diff=null;  // just  declaration of variables
    diff = date1.getTime() - date2.getTime();
    diffInMinutes= TimeUnit.MILLISECONDS.toMinutes(diff);
    log.info("diff min : "+difInMin); 
    return  diffInMinutes; // returns long value in minutes.
}

从JavaSE8开始,我建议使用API。对于Android用户,添加了java.time

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

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

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,那么我建议您使用下面评论中@Ole V.V建议的API

语法与java.time API几乎相同。上面的代码片段也适用于Three-Ten Android Backport API(如前面提到的@Basil Bourque),但有一个例外。不幸的是,Three Ten Android Backport API的
Duration
类没有提供从Duration对象提取小时部分、分钟部分等的帮助方法。相反,当您使用backport时,您需要先从持续时间中减去小时,然后减去分钟,这样只剩下秒:

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类

如果您想使用Three-Ten Backport API,只需将其包含到您的项目中即可。

tl;博士 晚上11:00到上午7:30=7.5或8.0或8.5或9.5小时或其他一些小时数,具体取决于特定日期和时区

Duration.between(
    ZonedDateTime.of( 2019 , 1 , 23 , 23 , 0 , 0 , 0 , ZoneId.of( "Africa/Cairo" ) ) ,
    ZonedDateTime.of( 2019 , 1 , 24 , 7 , 30 , 0 , 0 , ZoneId.of( "Africa/Cairo" ) )
)
.toString()
LocalDate ldStart = LocalDate.of( 2019 , 1 , 23 ) ;
LocalTime ldStart = LocalTime.of( 23 , 0 ) ;
ZonedDateTime zdtStart = ZonedDateTime.of( ldStart , ltStart , z ) ;
看这个

PT8H30M

计算经过的时间需要日期、时间和时区 由Markus Hänsel提出的建议是正确的,但没有考虑到夏令时(DST)等异常情况

你的问题不太清楚。您的意思是使用通用的24小时工作制来跟踪一天中的时间吗?或者你的意思是跟踪实际的时刻,比如两天前睡觉的时间,昨天睡觉的时间,等等

如果是后者,则不能使用
LocalDateDate
,因为根据定义,该类不能跟踪时刻。
LocalDateTime
类缺少时区或UTC偏移量的概念。因此,
LocalDateTime
表示大约26-27小时(全球时区范围)内的潜在时刻

以晚上11:00到早上7:30为例,这意味着在某个时区有8.5个小时,在该日期没有异常。但在DST转换的一天,这可能意味着7.5小时(“提前”,或9.5小时(“后退”)。或者像去年那样每天8.0个小时,那时只需半小时。或者在2007年。这些变化发生的频率比你可能意识到的要高。全球政界人士都有重新定义时区偏移量的倾向

➥ 结果是,您无法仅用一天中的时间可靠地计算经过的时间。您必须使用日期和时区

ZoneId
大陆/地区
的格式指定,例如
美国/蒙特利尔
非洲/卡萨布兰卡
,或
太平洋/奥克兰
。切勿使用2-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

ZoneDateTime
要跟踪时刻,请使用该类。此类将日期、时间和时区组合在一起

Duration.between(
    ZonedDateTime.of( 2019 , 1 , 23 , 23 , 0 , 0 , 0 , ZoneId.of( "Africa/Cairo" ) ) ,
    ZonedDateTime.of( 2019 , 1 , 24 , 7 , 30 , 0 , 0 , ZoneId.of( "Africa/Cairo" ) )
)
.toString()
LocalDate ldStart = LocalDate.of( 2019 , 1 , 23 ) ;
LocalTime ldStart = LocalTime.of( 23 , 0 ) ;
ZonedDateTime zdtStart = ZonedDateTime.of( ldStart , ltStart , z ) ;
还有停车时间

LocalDate ldStop = LocalDate.of( 2019 , 1 , 24 ) ;  // Next day.
LocalTime ldStop = LocalTime.of( 7 , 30 ) ;
ZonedDateTime zdtStop = ZonedDateTime.of( ldStop , ltStop , z ) ;
使用
Duration
class计算经过的时间

Duration d = Duration.between( zdtStart , zdtStop ) ;
ISO 8601 我建议您不要使用时间格式HH:MM:SS报告运行时间。而是在标准中使用标准

因此,8.5小时将是
PT8H30M

在解析/生成字符串时,java.time类默认使用ISO 8601格式

String output = d.toString() ;  // Generate `PT8H30M`.
和解析

Duration d = Duration.parse( "PT8H30M" ) ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(向我们展示您迄今为止所做的尝试。)请再次检查,我认为您所做的非常接近。唯一的问题是您的算法将返回完整的小时,而不是分钟等。如果您想要分钟等,那么您应该创建一个