Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何计算设定时间的剩余小时数_Java_Android_Timer_Alarm - Fatal编程技术网

Java 如何计算设定时间的剩余小时数

Java 如何计算设定时间的剩余小时数,java,android,timer,alarm,Java,Android,Timer,Alarm,我想在Android(Java)中创建一个类似警报的应用程序,我想计算还剩多少小时和分钟。当我把闹钟调到凌晨1点的时候。我现在的时间是晚上20:00,它会告诉我“闹钟5小时后会响”,但它会告诉我19小时后,如何解决它 Toast.makeText(this, "Hours: " + (calendar.getTime().getHours() - timePicker.getCurrentHour()) + "Minutes: " + (calendar.getTime().getMinutes

我想在Android(Java)中创建一个类似警报的应用程序,我想计算还剩多少小时和分钟。当我把闹钟调到凌晨1点的时候。我现在的时间是晚上20:00,它会告诉我“闹钟5小时后会响”,但它会告诉我19小时后,如何解决它

Toast.makeText(this, "Hours: " + (calendar.getTime().getHours() - timePicker.getCurrentHour()) + "Minutes: " + (calendar.getTime().getMinutes() - timePicker.getCurrentMinute()) , Toast.LENGTH_SHORT).show();

您应该使用JavaDate

Calendar cal = Calendar.getInstance().set(...); //set the date
Date alarmDate = cal.time;

long duration = alarmDate - System.currentTimeMillis();
int hours = duration / (1000 * 60 * 60);
java.time 现代解决方案使用java.time类

获取默认时区的当前时刻。如果重要,请与用户确认

ZoneId z = ZoneId.systemDefault() ; 
ZonedDateTime zdt = ZonedDateTime.now( z ) ;
提取一天中的时间

LocalTime lt = zdt.toLocalTime() ;
如果超过报警时间,则添加一天

LocalTime alarm = LocalTime.of( 1 , 0 ) ;

LocalDate ld = zdt.toLocalDate() ;
if( ! alarm.isBefore( lt ) ) {
    ld = ld.plusDays( 1 ) ;
}

ZonedDateTime fire = ZonedDateTime.of( ld , alarm , z ) 
如果您的其他代码需要UTC,请提取
Instant

Instant instant = fire.toInstant() ;
计算经过的时间

Duration d = Duration.between( zdt , fire ) ; 
int hours = d.toHoursPart() ;
int minutes = d.toMinutesPart() ;
如果当前时刻非常接近报警时间,您应该添加多一点代码,这是一个伪造的因素,足够接近,当代码执行时,它可能会滚动到报警时间


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

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

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

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

从哪里获得java.time类

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

    • 对于早期的Android(请尝试以下操作:

          Calendar cal = Calendar.getInstance();
      
          int hrs = cal.get(Calendar.HOUR_OF_DAY);
      
          Calendar alCal = Calendar.getInstance();
          alCal.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour());
      
          alCal.set(Calendar.MINUTE, timePicker.getCurrentMinute());
      
          if(timePicker.getCurrentHour() < hrs){
              alCal.add(Calendar.DAY_OF_MONTH, 1);
          }
      
          long diff = alCal.getTimeInMillis() - cal.getTimeInMillis();
      
          long leftHrs = (diff / (60 * 60 * 1000));
          long leftMin = (diff / (60 * 1000)) - (leftHrs * 60);
      
          // Output
          Toast.makeText(this,"Hours: "+leftHrs+"Minutes: "+leftMin,Toast.LENGTH_SHORT).show();
      
      Calendar cal=Calendar.getInstance();
      int hrs=cal.get(日历小时);
      Calendar alCal=Calendar.getInstance();
      alCal.set(Calendar.HOUR\u OF_DAY,timePicker.getCurrentHour());
      alCal.set(Calendar.MINUTE,timePicker.getCurrentMinute());
      if(timePicker.getCurrentHour()
      请在计算时差的地方分享代码?我添加了代码来回答您的问题-您没有考虑将来的报警时间-您现在正在减去(晚上10点(或2000小时))-凌晨1点(或凌晨1点)小时——也就是19小时。这些糟糕的类在几年前就被java.time类取代了。我认为Android不支持API<28(LocalTime/LocalDate)中的这些类…仅供参考,诸如
      java.util.date
      java.util.Calendar
      、和
      java.text.SimpleDataFormat
      等令人烦恼的旧日期时间类现在已经被这些类所取代,成为了遗留类。在项目中,大多数java.time功能都被移植到java 6和java 7。进一步适应早期的Android(代码的作用是什么?我如何获得剩余的小时和分钟?我的API级别现在是19小时下午4:00,我将时间设置为凌晨1:00,它给我“小时:-14”和“分钟:-899”,它应该给我8小时而不是14小时,怎么解决?@movsemartirosyan,你选择的日期是什么?你也可以分享timepicker返回的当前HR和分钟值以及datepicker返回的日期。另外,我稍微更新了分钟计算的逻辑,所以请看一看我不选择日期,我只从时间选择器中选择小时和分钟,例如,我选择01:00 am,我想计算从现在到01:00 am还剩多少小时和分钟。所以,警报时间总是只设置为第二天?看,现在是16:00 pm,我使用时间选择器将时间设置为例如18:00 pm,它给出了剩余小时2。这是正确的,但当我设置为3:00时,它是giv给我(3-16=-13)个小时,而不是给剩下的7个小时(从下午16:00到凌晨3:00)