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

KMM项目无Java依赖:用kotlinx.datetime实现合规日期转周数

基于kotlinx.datetime实现符合周规则的周数计算

首先明确规则:一年的第一周是包含1月4日的那一周,以下是完整的实现方案:

核心思路修正与实现

首先注意kotlinx.datetime.DayOfWeek的ordinal是0-based(周一为0,周日为6),而你的计算步骤需要1-based的星期序号(周一为1,周日为7),所以第一步要做转换。然后针对周数为0或53的边界情况做处理:

import kotlinx.datetime.LocalDate
import kotlinx.datetime.DateTimeUnit

fun getWeekOfYear(date: LocalDate): Int {
    // 将kotlinx的0-based星期序号转为1-based(周一=1,周日=7)
    val dayOfWeekNumber = date.dayOfWeek.ordinal + 1
    var week = (10 + date.dayOfYear - dayOfWeekNumber) / 7

    return when {
        // 正常周数范围直接返回
        week in 1..52 -> week
        // 周数为0,属于上一年的最后一周,返回上一年总周数
        week < 1 -> getTotalWeeksOfYear(date.year - 1)
        // 周数为53,检查是否属于当年
        else -> {
            // 取当前日期所在周的周四:周四所在年份决定周归属
            val thursday = date.plus((4 - dayOfWeekNumber), DateTimeUnit.DAY)
            if (thursday.year == date.year) 53 else 1
        }
    }
}

// 获取指定年份的总周数
fun getTotalWeeksOfYear(year: Int): Int {
    // 12月28日一定在当年的最后一周,用它的周数作为当年总周数
    val dec28 = LocalDate(year, 12, 28)
    val dayOfWeekNumber = dec28.dayOfWeek.ordinal + 1
    return (10 + dec28.dayOfYear - dayOfWeekNumber) / 7
}

关键逻辑说明

  1. 星期序号转换:把DayOfWeek.ordinal加1,适配你给定的计算步骤要求。
  2. 周数为0的处理:这类日期属于上一年的最后一周,直接调用getTotalWeeksOfYear获取上一年的总周数即可。
  3. 周数为53的处理:通过判断当前日期所在周的周四年份,确认该周归属:
    • 若周四在当年,则是当年的第53周;
    • 若周四在下一年,则该周属于下一年的第1周。
  4. 总周数计算:利用12月28日的周数确定当年总周数,因为12月28日必然落在当年的最后一周,不会跨到下一年。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:45:39