如何计算设定时间的剩余小时数
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.Date
、java.util.Calendar
和 java.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.Date
、Calendar
和 SimpleDateFormat
。
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 8、Java SE 9、Java SE 10、Java SE 11 和更高版本 - 具有捆绑实现的标准 Java API 的一部分。 Java 9 添加了一些小功能和修复。 Java SE 6 和 Java 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 的试验场。您可以在这里找到一些有用的类,例如Interval
、YearWeek
、YearQuarter
和more。
【讨论】:
代码有什么作用?我怎样才能得到剩余的小时和分钟?我的 API 级别是 19以上是关于如何计算设定时间的剩余小时数的主要内容,如果未能解决你的问题,请参考以下文章