如何从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") }
关键修正说明
- 初始化
Calendar实例为当前日期,每次循环只累加1天,确保遍历接下来的20天。 - 使用
Calendar.get(Calendar.DAY_OF_WEEK)获取准确的星期值,并转换为你需要的索引格式(周日=0)。 - 将
offDaysString转换为去重的Set,避免重复计数,同时提升查找效率。 - 移除冗余的非空判断,简化代码逻辑。
内容的提问来源于stack exchange,提问作者Jaminee Ranjan Mondal
相关产品推荐
相关产品推荐

