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

Posted

技术标签:

【中文标题】如何计算设定时间的剩余小时数【英文标题】:How to calculate remaining hours to setted time 【发布时间】:2018-12-29 16:52:46 【问题描述】:

我想在 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();

【问题讨论】:

请分享您计算时差的代码? 我已添加代码 回答您的问题 - 您没有考虑未来的闹钟时间 - 您正在减去现在(晚上 10 点(或 2000 小时)) - 凌晨 1 点(或 0100)小时 - 即 19 小时。跨度> 【参考方案1】:

试试这样的:

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

【讨论】:

现在下午 4:00,我将时间设置为凌晨 1:00,它给了我“小时:-14”和“分钟:-899”,它应该给我 8 小时而不是 -14 小时,怎么解决? @MovsesMartirosyan,你选择的日期是什么时候?您是否还可以共享 timepicker 返回的 currentHr 和 minute 值以及 datepicker 返回的日期。另外,我稍微更新了分钟计算的逻辑,请大家看看 我不选择日期,我只从时间选择器中选择小时和分钟,例如我选择上午 01:00,我想计算从现在到上午 01:00 还剩多少小时和分钟. 所以,闹钟时间总是设置为第二天? 看,现在是下午 16:00,我使用 timepicker 将时间设置为例如下午 18:00,它给出的剩余时间为 2。这是正确的,但是当我设置为凌晨 3:00 时,它给出了me (3-16= -13) hours 而不是给 Hours left 7(从下午 16:00 到凌晨 3:00)【参考方案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);

【讨论】:

这些可怕的类在几年前被 java.time 类所取代。 Android 不支持 API 中的那些类 仅供参考,java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等麻烦的旧日期时间类现在已被 java.time 类所取代。大多数 java.time 功能在 ThreeTen-Backport 项目中被反向移植到 Java 6 和 Java 7。进一步适用于ThreeTenABP 中的早期 Android (How to use ThreeTenABP…【参考方案3】:

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-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

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

从哪里获得 java.time 类?

Java SE 8Java SE 9Java SE 10Java SE 11 和更高版本 - 具有捆绑实现的标准 Java API 的一部分。 Java 9 添加了一些小功能和修复。 Java SE 6Java SE 7 大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7。 Android java.time 类的 Android 捆绑包实现的更高版本。 对于早期的 Android (ThreeTenABP 项目适应 ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuarter 和more。

【讨论】:

代码有什么作用?我怎样才能得到剩余的小时和分钟?我的 API 级别是 19

以上是关于如何计算设定时间的剩余小时数的主要内容,如果未能解决你的问题,请参考以下文章

如何计算给定日期的剩余天数、小时数、分钟数和秒数?

设定某个时间段进行某项任务

聊聊“扭蛋”,即常规的付费抽奖

Swift:在每天设定的时间之间创建重复的本地通知

Jenkins定时构建

WIN7系统中,如何在登录档中修改系统时间格式?