如何计算剩余时间到设定的时间

时间:2018-12-29 16:52:46

标签: java android timer alarm

我想在Android(Java)中创建类似警报的应用程序,我想计算还剩下多少小时和几分钟。当我将闹钟设置为凌晨1:00时。我当前的时间是下午20:00,它将显示“ 5小时后会发出警报”,但显示19小时后,如何解决。

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

3 个答案:

答案 0 :(得分:2)

您应该使用Java日期。

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

long duration = alarmDate - System.currentTimeMillis();
int hours = duration / (1000 * 60 * 60);

答案 1 :(得分:0)

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

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

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

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

尝试这样的事情:

    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();