Go语言[][2]time.Time类型时间数组升序验证问题求助
验证
[][2]time.Time考勤时间数组的完整实现 需求背景
需要编写函数验证[][2]time.Time类型数组,每组元素对应入职时间和离岗时间,需覆盖所有无效组合且不误判有效场景,核心难点是处理time.Time默认值(视为未填写离岗时间,代表员工未离岗,此情况合法,但不能新增后续入职记录)。
无效判定规则
- 所有时间不能晚于当前时间;
- 时间不能重复:包括单条记录的入职/离岗时间重复,或前一条的离岗时间与后一条的入职时间重复;
- 若上一条记录的离岗时间为默认值(未离岗),则不能存在后续入职记录;
- 时间必须升序排列:每条记录的入职时间早于其离岗时间(若离岗时间非默认),且后一条的入职时间必须晚于前一条的离岗时间(若前一条离岗时间非默认)。
原始不完整代码
func validSliceArrayTime(slarti [][2]time.Time) bool { now_time := time.Now() var rtime, ltime time.Time var rt_is_def bool for _, v := slarti { rtime = v[1] rt_is_def = rtime.Year() <= 1 switch { case v[0].Year() <= 1: return false case v[0].After(now_time): return false case (!v[0].Before(rtime) && !rt_is_def): return false case !v[0].After(ltime): return false // case !rtime.After(ltime): // return false // case rtime.After(now_time): // return false default: ltime = v[1] } } return true }
完善后的完整验证函数
import "time" func validSliceArrayTime(slarti [][2]time.Time) bool { now := time.Now() var prevOutTime time.Time var hasUnfinishedEntry bool for idx, entry := range slarti { inTime := entry[0] outTime := entry[1] // 入职时间不能为默认值(未填写) if inTime.IsZero() { return false } // 规则1:入职时间不能晚于当前时间 if inTime.After(now) { return false } // 规则1:离岗时间(非默认)不能晚于当前时间 if !outTime.IsZero() && outTime.After(now) { return false } // 规则3:存在未离岗记录时,后续记录无效 if hasUnfinishedEntry { return false } // 规则4:单条记录入职时间必须早于离岗时间(离岗非默认时) if !outTime.IsZero() && !inTime.Before(outTime) { return false } // 规则2:单条记录的入职/离岗时间不能重复 if !outTime.IsZero() && inTime.Equal(outTime) { return false } // 规则2:非第一条记录时,当前入职时间不能与上一条离岗时间重复 if idx > 0 && !prevOutTime.IsZero() && inTime.Equal(prevOutTime) { return false } // 规则4:非第一条记录时,当前入职时间必须晚于上一条离岗时间(上一条离岗非默认时) if idx > 0 && !prevOutTime.IsZero() && !inTime.After(prevOutTime) { return false } // 更新状态:当前记录未离岗则标记,否则更新上一条离岗时间 if outTime.IsZero() { hasUnfinishedEntry = true } else { prevOutTime = outTime } } return true }
关键规则处理说明
- 默认值判断:使用官方推荐的
time.Time.IsZero()替代Year() <= 1,判断时间是否为默认值更可靠; - 未离岗记录管控:用
hasUnfinishedEntry标记状态,一旦存在未离岗记录,后续所有记录直接判定无效; - 时间重复校验:分别检查单条记录内的时间重复、跨记录的时间重复两种场景;
- 升序逻辑验证:同时保障单条记录内的时间顺序,以及跨记录的时间递进关系;
- 当前时间校验:对所有非默认的入职、离岗时间都做晚于当前时间的校验。
内容的提问来源于stack exchange,提问作者Matheus Saraiva
相关产品推荐
相关产品推荐

