我想在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();
答案 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 类。
获取默认时区的当前时刻。如果重要,请与用户确认。
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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();