如何在Kotlin中获取本周及上周的起止日期(周一为起始)
正确获取本周/上周起止日期(周一为周起始)的实现方案
为什么不建议用Calendar类?
- 旧API设计混乱,线程不安全,默认周起始是周日,手动调整容易出bug
- 频繁调用
clear()完全没必要,而且就算调用了,也容易因为字段设置顺序问题导致计算错误
推荐使用Java 8+的java.time API(Kotlin原生支持)
这个API是不可变类,线程安全,日期计算逻辑清晰,完美解决你的需求。
完整实现代码
import java.time.DayOfWeek import java.time.LocalDate import java.time.ZoneId import java.time.format.DateTimeFormatter import java.time.temporal.TemporalAdjusters // 按需指定时区,比如中国时区可以写ZoneId.of("Asia/Shanghai") private val zoneId = ZoneId.systemDefault() // 日期格式化器,用于生成yyyy-MM-dd格式的字符串 private val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") // 计算核心日期逻辑 private val today = LocalDate.now() // 本周一:如果今天是周一就取今天,否则取上周一 private val thisWeekMonday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)) // 本周日:如果今天是周日就取今天,否则取本周日 private val thisWeekSunday = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)) // 上周起止日期:本周一减7天是上周一,本周一减1天是上周日 private val lastWeekMonday = thisWeekMonday.minusWeeks(1) private val lastWeekSunday = thisWeekMonday.minusDays(1) // 转成你需要的Long类型时间戳(对应日期当天0点,或周日最后一刻) private var thisWeekStart: Long = thisWeekMonday.atStartOfDay(zoneId).toInstant().toEpochMilli() // 如果你需要本周日23:59:59.999的时间戳,用下面这行;如果只需要周日0点,直接用atStartOfDay即可 private var thisWeekEnd: Long = thisWeekSunday.atStartOfDay(zoneId).plusDays(1).minusNanos(1).toInstant().toEpochMilli() private var lastWeekStart: Long = lastWeekMonday.atStartOfDay(zoneId).toInstant().toEpochMilli() private var lastWeekEnd: Long = lastWeekSunday.atStartOfDay(zoneId).plusDays(1).minusNanos(1).toInstant().toEpochMilli() // 如果你需要yyyy-MM-dd格式的字符串,直接格式化即可 val thisWeekStartStr = thisWeekMonday.format(dateFormatter) val thisWeekEndStr = thisWeekSunday.format(dateFormatter) val lastWeekStartStr = lastWeekMonday.format(dateFormatter) val lastWeekEndStr = lastWeekSunday.format(dateFormatter)
关键说明
- 周起始设置:通过
TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)确保周一为周起始,无需手动计算偏移量 - 时间戳转换:必须指定时区,避免不同时区下日期偏移的问题
- 上周结束日期:直接用本周一减1天即可,逻辑简单不易错
- 格式化字符串:如果需要
yyyy-MM-dd格式,用DateTimeFormatter直接格式化LocalDate即可,不用先转时间戳再反向解析
内容的提问来源于stack exchange,提问作者Hyejung
相关产品推荐
相关产品推荐

