Android开发:如何判断当前时间是否处于指定开闭时段之间
Android判断当前时间是否在营业时段内
步骤1:清理并格式化时间字符串
注意你的示例开始时间末尾多了个冒号("09:00:00:"),需要先处理掉无效字符,确保时间格式为HH:mm:ss:
fun cleanTimeString(timeStr: String): String { // 只保留数字和冒号,截取前8位保证符合HH:mm:ss格式 return timeStr.replace("[^0-9:]".toRegex(), "").take(8) }
步骤2:将字符串转换为时间对象
Android API 26及以上可直接用java.time.LocalTime(Java 8+时间API),低版本需引入ThreeTenABP兼容库。
API 26+ 实现代码:
import java.time.LocalTime import java.time.format.DateTimeFormatter // 定义时间格式化器 val timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss") fun stringToLocalTime(timeStr: String): LocalTime? { val cleanedStr = cleanTimeString(timeStr) return try { LocalTime.parse(cleanedStr, timeFormatter) } catch (e: Exception) { // 格式错误时返回null,可根据业务调整默认值 null } }
低版本兼容(ThreeTenABP):
先在build.gradle添加依赖:
implementation 'com.jakewharton.threetenabp:threetenabp:1.4.6'
在Application类初始化库:
class MyApp : Application() { override fun onCreate() { super.onCreate() AndroidThreeTen.init(this) } }
转换代码和API 26+一致,只需替换导入路径为org.threeten.bp.LocalTime和org.threeten.bp.format.DateTimeFormatter。
步骤3:判断当前时间是否在营业时段内
获取当前时间后,分常规同一天和跨天两种情况判断:
fun isCurrentTimeInBusinessHours(startTimeStr: String, endTimeStr: String): Boolean { val startTime = stringToLocalTime(startTimeStr) ?: return false val endTime = stringToLocalTime(endTimeStr) ?: return false val currentTime = LocalTime.now() return if (startTime.isBefore(endTime)) { // 常规情况:开始时间早于结束时间(同一天) currentTime.isAfter(startTime) && currentTime.isBefore(endTime) } else { // 跨天情况:比如开始时间22:00,结束时间06:00 currentTime.isAfter(startTime) || currentTime.isBefore(endTime) } }
调用示例
val start = "09:00:00:" val end = "21:00:00" val isInBusinessHours = isCurrentTimeInBusinessHours(start, end) // 根据返回值处理UI逻辑,比如显示「营业中」或「已打烊」
注意事项
- 确保设备系统时间准确,否则判断结果会出错。
- 若需指定时区(比如避免用户手动改时区导致偏差),可使用
LocalTime.now(ZoneId.of("Asia/Shanghai"))明确时区。
内容的提问来源于stack exchange,提问作者Mahnoor Aslam
相关产品推荐
相关产品推荐

