数组时间片。升序验证中的时间

一段时间以来,我一直在尝试创建一个函数来验证 type 的变量[][2]time.Time。数组的列time.Time分别代表一对输入日期和出站日期。但我无法生成解决所有可能无效组合的代码,同时不会使实际有效的组合无效。无效的规则是:

  • 日期不能长于当前日期和时间。

  • 时代不可能一样。例如:[][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC)}}。或者[][2]time.Time{ {time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)}}

  • 如果之前没有输出,就不可能有新的条目。例如: [][2]time.Time{ {time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Time{}//Default}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)} }

  • 日期必须按升序排列,即在这种情况下表示条目的第一个切片日期必须早于第二个,第二个早于第三个,依此类推。因此,下面是无效组合的示例: [][2]time.Time{ {time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 7, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)} }

给我带来最大问题的是默认值,因为它们是有效的 Time 对象,但它们应该被视为 null,即未报告输出日期。想象一下,好像是一个工人的积分表,如果有进入日期,但输出是默认的,意味着工人进入但还没有离开,即是有效的情况。但是,如果工作人员之前的条目还没有输出,那么注册新条目将是无效的。这是我到目前为止能够生成的代码。是的,它还没有完成,因为我已经修改了很多次,我不知道如何继续前进了。

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

}


largeQ
浏览 108回答 1
1回答

蛊毒传说

要检查 a 是否time.Time为零值,请使用Time.IsZero()。除此之外,只需一个接一个地实施您的规则。它不会是最有效的解决方案,但它会很干净和简单,一旦它正常工作,您就可以对其进行改进:func isValid(slarti [][2]time.Time) bool {&nbsp; &nbsp; now := time.Now()&nbsp; &nbsp; for i, v := range slarti {&nbsp; &nbsp; &nbsp; &nbsp; v1, v2 := v[0], v[1]&nbsp; &nbsp; &nbsp; &nbsp; // Rule #3&nbsp; &nbsp; &nbsp; &nbsp; if v1.IsZero() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // Rule #1: times must be in the past&nbsp; &nbsp; &nbsp; &nbsp; if now.Before(v1) || now.Before(v2) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // Rule #2: times can't be the same&nbsp; &nbsp; &nbsp; &nbsp; if v1.Equal(v2) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if i > 0 && v1.Equal(slarti[i-1][1]) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // Rule #3: invalid entry if no output before:&nbsp; &nbsp; &nbsp; &nbsp; if i > 0 && slarti[i-1][1].IsZero() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // Rule #4: times must be in ascending order:&nbsp; &nbsp; &nbsp; &nbsp; if !v2.IsZero() && v2.Before(v1) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; if i > 0 && v1.Before(slarti[i-1][1]) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return true // Got this far: valid}这是测试所有规则以及有效输入的测试代码(在Go Playground上尝试):cases := []struct {&nbsp; &nbsp; name&nbsp; string&nbsp; &nbsp; input [][2]time.Time&nbsp; &nbsp; valid bool}{&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name:&nbsp; "Valid",&nbsp; &nbsp; &nbsp; &nbsp; input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC)}},&nbsp; &nbsp; &nbsp; &nbsp; valid: true,&nbsp; &nbsp; },&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name:&nbsp; "Valid (2)",&nbsp; &nbsp; &nbsp; &nbsp; input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)}},&nbsp; &nbsp; &nbsp; &nbsp; valid: true,&nbsp; &nbsp; },&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name:&nbsp; "Valid (3)",&nbsp; &nbsp; &nbsp; &nbsp; input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Time{}}},&nbsp; &nbsp; &nbsp; &nbsp; valid: true,&nbsp; &nbsp; },&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name:&nbsp; "Rule #1",&nbsp; &nbsp; &nbsp; &nbsp; input: [][2]time.Time{{time.Date(2023, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2023, 11, 23, 9, 0, 0, 0, time.UTC)}},&nbsp; &nbsp; },&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name:&nbsp; "Rule #2",&nbsp; &nbsp; &nbsp; &nbsp; input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC)}},&nbsp; &nbsp; },&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name:&nbsp; "Rule #2 (2)",&nbsp; &nbsp; &nbsp; &nbsp; input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)}},&nbsp; &nbsp; },&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name:&nbsp; "Rule #3",&nbsp; &nbsp; &nbsp; &nbsp; input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Time{}}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)}},&nbsp; &nbsp; },&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name:&nbsp; "Rule #3 (2)",&nbsp; &nbsp; &nbsp; &nbsp; input: [][2]time.Time{{time.Time{}, time.Date(2020, 11, 23, 9, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)}},&nbsp; &nbsp; },&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name:&nbsp; "Rule #4",&nbsp; &nbsp; &nbsp; &nbsp; input: [][2]time.Time{{time.Date(2020, 11, 23, 8, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 7, 0, 0, 0, time.UTC)}, {time.Date(2020, 11, 23, 10, 0, 0, 0, time.UTC), time.Date(2020, 11, 23, 11, 0, 0, 0, time.UTC)}},&nbsp; &nbsp; },}for i, c := range cases {&nbsp; &nbsp; if valid := isValid(c.input); valid != c.valid {&nbsp; &nbsp; &nbsp; &nbsp; log.Printf("[%d] %q expected valid: %t, got: %t", i, c.name, c.valid, valid)&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go