You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:40:47