Android中Kotlin获取重置为00:00的当前日期的高效实现方法?
问题
我目前在Android中使用Calendar实例获取当前日期和时间,相关代码如下:
private fun getCurrentCalendar() { Calendar.getInstance() }
输出结果为:Wed Jul 20 21:45:52 GMT+01:00 2022
若要将时间重置为00:00,我使用以下函数:
fun resetCalendarTime(calendar: Calendar) { calendar.set(Calendar.HOUR_OF_DAY, 0) calendar.set(Calendar.MINUTE, 0) calendar.set(Calendar.SECOND, 0) calendar.set(Calendar.MILLISECOND, 0) }
执行后输出:Wed Jul 20 00:00:00 GMT+01:00 2022
请问该实现方式是否可行,或有无更高效的替代方案?
回答
原实现的可行性
你的代码完全可行,能够正确将Calendar实例的时间部分重置为当天的00:00:00.000。但需要注意Calendar是可变类,直接修改传入的实例会改变原对象的状态,如果其他代码也引用了这个实例,可能会引发意外的副作用。
更优的替代方案
推荐使用Android官方推荐的java.time API(Android 8.0及以上原生支持,低版本可通过ThreeTenABP库兼容),这套API设计更简洁,且具备不可变性、线程安全的特性,能避免Calendar类的诸多历史问题:
1. 直接获取当天起始时间(00:00:00)
import java.time.LocalDate import java.time.LocalDateTime import java.time.ZoneId import java.util.Date // 获取系统默认时区下的当天起始时间 fun getCurrentDayStart(): LocalDateTime { return LocalDate.now().atStartOfDay() } // 如果需要兼容旧代码,转换为Calendar实例 fun toCalendar(localDateTime: LocalDateTime): Calendar { val instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant() return Calendar.getInstance().apply { time = Date.from(instant) } }
2. 重置已有时间实例的时间部分
如果已经持有一个包含时间的实例,可通过以下方式重置:
import java.time.LocalDateTime fun resetTimeToMidnight(dateTime: LocalDateTime): LocalDateTime { return dateTime.withHour(0) .withMinute(0) .withSecond(0) .withNano(0) }
为什么选择java.time API
- 不可变性:所有操作都会返回新实例,不会修改原对象,从根源避免状态污染问题
- 清晰的职责划分:拆分了
LocalDate(仅日期)、LocalDateTime(日期+时间)等不同概念,不像Calendar那样混用多个职责 - 线程安全:无需额外处理多线程并发问题
- 长期维护性:是Java及Android平台的新一代日期时间API,会持续得到官方支持,而
Calendar属于旧API,不再新增功能
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

