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 }
关键逻辑说明
- 星期序号转换:把
DayOfWeek.ordinal加1,适配你给定的计算步骤要求。 - 周数为0的处理:这类日期属于上一年的最后一周,直接调用
getTotalWeeksOfYear获取上一年的总周数即可。 - 周数为53的处理:通过判断当前日期所在周的周四年份,确认该周归属:
- 若周四在当年,则是当年的第53周;
- 若周四在下一年,则该周属于下一年的第1周。
- 总周数计算:利用12月28日的周数确定当年总周数,因为12月28日必然落在当年的最后一周,不会跨到下一年。
内容的提问来源于stack exchange,提问作者Marcos Campos
相关产品推荐
相关产品推荐

