Android中如何比较两个时间?时间区间判断代码咨询
在Android中比较时间的方法及时间区间判断实现
在Android里处理时间比较,我会分两种场景给你说明:传统的兼容方案,以及更推荐的现代API方案,同时帮你完善那个判断时间是否在区间内的函数~
一、传统方案(兼容所有Android版本)
如果你需要兼容Android 8.0以下的版本,可以用SimpleDateFormat和Calendar(或者直接用时间戳比较,更简单)。你给出的函数可以完善成这样,还考虑了跨天时间区间的情况(比如22:00:00到次日06:00:00):
private boolean isBetween(String t1, String t2, String target) { boolean result = false; try { // 注意指定Locale,避免因系统语言差异解析失败 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); Date time1 = sdf.parse(t1); Date time2 = sdf.parse(t2); Date targetTime = sdf.parse(target); // 转换成毫秒级时间戳,直接比较数值更直观 long t1Millis = time1.getTime(); long t2Millis = time2.getTime(); long targetMillis = targetTime.getTime(); // 分两种情况处理: if (t1Millis <= t2Millis) { // 正常区间:比如08:00到18:00,目标时间要在两者之间 result = targetMillis >= t1Millis && targetMillis <= t2Millis; } else { // 跨天区间:比如22:00到次日06:00,目标时间要么大于等于t1,要么小于等于t2 result = targetMillis >= t1Millis || targetMillis <= t2Millis; } } catch (ParseException e) { e.printStackTrace(); // 解析失败时可根据业务需求返回默认值,这里返回false } return result; }
二、推荐方案(Android 8.0+ 或引入兼容库)
从Android 8.0(API 26)开始,系统支持Java 8的java.time包,这套API线程安全、用法更简洁。如果要兼容低版本,可以引入ThreeTenABP库(直接在gradle里添加依赖即可)。
用LocalTime(专门处理时分秒的类)实现时间区间判断:
private boolean isBetweenModern(String t1, String t2, String target) { try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss"); LocalTime time1 = LocalTime.parse(t1, formatter); LocalTime time2 = LocalTime.parse(t2, formatter); LocalTime targetTime = LocalTime.parse(target, formatter); boolean result; if (time1.isBefore(time2) || time1.equals(time2)) { // 正常区间:目标时间不早于t1,且不晚于t2 result = !targetTime.isBefore(time1) && !targetTime.isAfter(time2); } else { // 跨天区间:目标时间不早于t1,或者不晚于t2 result = !targetTime.isBefore(time1) || !targetTime.isAfter(time2); } return result; } catch (DateTimeParseException e) { e.printStackTrace(); return false; } }
额外注意事项
- 如果你的时间是带日期的完整时间戳(比如
yyyy-MM-dd HH:mm:ss),处理逻辑类似,只需要把对应的类换成Date/Calendar(传统)或者LocalDateTime(现代)即可。 - 直接比较long类型的时间戳(毫秒数)是最高效的方式,比如如果你的输入已经是long类型,直接按数值比较就行,不用解析成日期对象。
- 解析时间时一定要指定Locale,否则在部分非中文系统上可能出现解析错误。
内容的提问来源于stack exchange,提问作者Jagdish Choudhary
相关产品推荐
相关产品推荐

