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

如何在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)

关键说明

  1. 周起始设置:通过TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)确保周一为周起始,无需手动计算偏移量
  2. 时间戳转换:必须指定时区,避免不同时区下日期偏移的问题
  3. 上周结束日期:直接用本周一减1天即可,逻辑简单不易错
  4. 格式化字符串:如果需要yyyy-MM-dd格式,用DateTimeFormatter直接格式化LocalDate即可,不用先转时间戳再反向解析

内容的提问来源于stack exchange,提问作者Hyejung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:36:59