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

如何从offday字符串获取VacationCount?我的Kotlin代码为何失效?

代码问题分析及修正

核心问题点

  • cal变量未定义初始化:代码直接调用cal.add(),但从未声明或初始化Calendar实例,这会直接导致编译错误。
  • 日期累加逻辑错误:cal.add(Calendar.DATE, i.toInt())的写法会让日期每次累加i天(第一次加0,第二次加1,第三次加2...),最终日期会变成当前日期 + 0+1+2+...+19,和“遍历接下来20天”的需求完全不符。
  • 星期计算方式错误:通过timeInMillis/(1000*60*60*24*7) %7计算星期几的方式忽略了时区、夏令时、月份天数差异等问题,结果不准确。而且Calendar的DAY_OF_WEEK取值是周日=1、周一=2...周六=7,和你注释的“sun=0”不匹配,会导致休息日匹配错误。
  • 冗余的非空判断:offDaysString是val且初始化为非空字符串,if (offDaysString != null)完全多余,不会触发任何分支。
  • 重复计数逻辑错误:内层循环遍历整个offDays数组,只要字符匹配就累加vacationCount,比如offDaysString里的多个8会让同一个休息日被多次计数,但实际需求应该是判断当天是否属于休息日,而非统计匹配的字符数量。

修正后的代码

import java.util.Calendar

fun main() {
    val offDaysString = "8888856"
    val returnPending = 20 // 接下来要统计的天数

    // 去重并转换为休息日的星期数字集合(注意:这里假设5、6、8对应实际星期值,需根据需求调整)
    val offDaySet = offDaysString.map { it.toString().toInt() }.toSet()

    var vacationCount = 0
    val cal = Calendar.getInstance() // 初始化Calendar实例为当前日期

    for (i in 0 until returnPending) {
        // 获取当前循环对应的星期值,转换为你需要的格式(比如周日=0的话,需要减1)
        val dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) - 1 // 现在sun=0, Mon=1...Sat=6

        // 判断当天是否属于休息日
        if (offDaySet.contains(dayOfWeek)) {
            vacationCount++
        }

        // 日期加1,进入下一天
        cal.add(Calendar.DATE, 1)
    }

    println("Vacation count: $vacationCount")
}

关键修正说明

  1. 初始化Calendar实例为当前日期,每次循环只累加1天,确保遍历接下来的20天。
  2. 使用Calendar.get(Calendar.DAY_OF_WEEK)获取准确的星期值,并转换为你需要的索引格式(周日=0)。
  3. 将offDaysString转换为去重的Set,避免重复计数,同时提升查找效率。
  4. 移除冗余的非空判断,简化代码逻辑。

内容的提问来源于stack exchange,提问作者Jaminee Ranjan Mondal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:17:38