Kotlin根据手机时间切换地图样式异常问题排查
问题分析与解决方案
我一眼就看出问题所在啦!你遇到的地图样式一直显示夜间的问题,根源在于直接用Date对象做时间对比——SimpleDateFormat.parse()解析出来的parseNight和parseDay其实是1970年1月1日对应的时间点,而currentTime是当前的完整日期时间,所以currentTime.after(parseNight)永远会返回true,这就导致地图一直锁定夜间样式了。
正确的逻辑思路
我们需要对比的是当天的时间区间:18:00到次日6:00用夜间样式,6:00到18:00用日间样式。最靠谱的做法是把时间转换成分钟数(或直接用小时分钟数值)来比较,完全避开日期差异的干扰。
修正后的代码方案
方案1:用分钟数对比(兼容所有Android版本)
// 获取当前时间的小时和分钟,转换成总分钟数 val calendar = Calendar.getInstance() val currentHour = calendar.get(Calendar.HOUR_OF_DAY) val currentMinute = calendar.get(Calendar.MINUTE) val currentTotalMinutes = currentHour * 60 + currentMinute // 转换夜间/日间起始时间为分钟数 val nightStartMinutes = 18 * 60 + 0 val dayStartMinutes = 6 * 60 + 0 // 时间区间判断 if (currentTotalMinutes >= nightStartMinutes || currentTotalMinutes < dayStartMinutes) { // 18:00 到次日 6:00:显示夜间样式 mMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(this, R.raw.night_style)) } else { // 6:00 到 18:00:显示日间样式 mMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(this, R.raw.day_style)) }
方案2:用LocalTime(Android API 26+ 或使用三方库兼容)
如果你的项目支持Android 8.0+,可以用更简洁的LocalTime来处理:
import java.time.LocalTime val currentTime = LocalTime.now() val nightStart = LocalTime.of(18, 0) val dayStart = LocalTime.of(6, 0) if (currentTime.isAfter(nightStart) || currentTime.isBefore(dayStart)) { mMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(this, R.raw.night_style)) } else { mMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(this, R.raw.day_style)) }
这两种方法都只关注当天的时间数值,逻辑清晰且不会出现日期对比的坑,能完美实现你想要的日夜样式切换效果。
内容的提问来源于stack exchange,提问作者user9590653
相关产品推荐
相关产品推荐

