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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:35:11