如何获取元组切片(小时,分钟)

时间:2018-11-18 11:22:46

标签: datetime go time tuples slice

我有一个无法解决的问题。我正在使用https://github.com/kmanley/golang-tuple创建元组。

我有一个分钟清单:

minutes := int{0, 30} // Minutes are 0 and 30

还有四个参数:startstartBreakstopstopBreak

start := tuple.NewTupleFromItems(9, 30) // It represents "9:30"
startBreak := tuple.NewTupleFromItems(12, 0) // It represents "12:00"
stop := tuple.NewTupleFromItems(21, 0) // It represents "21:00"
stopBreak := tuple.NewTupleFromItems(14, 30) // It represents "14:30"

我想使用(hour, minutes)切片中的所有分钟数来获取元组minutes的切片,并且它们一定不能包含在startBreak-stopBreak的范围内(它可以等于{{ 1}}或startBreak,因此范围将变为stopBreak12:30, 13:00, 13:30, 14:00(可以等于stop-startstart,因此范围将变为stop)。

例如,使用这四个参数,最终结果将是:

21:30, 22:00, 22:30, ..., 8:30, 9:00

1 个答案:

答案 0 :(得分:1)

这是演示此操作的最少代码,我没有进行任何数据验证。

func periods(minutes, start, startBreak, stopBreak, stop *tuple.Tuple) (out []tuple.Tuple) {

    // next() moves current to the next minute interval
    i := 0
    curr := tuple.NewTupleFromItems(start.Get(0), minutes.Get(0))
    next := func() {
        i = (i + 1) % minutes.Len()
        curr.Set(1, minutes.Get(i))
        if i == 0 {
            curr.Set(0, curr.Get(0).(int)+1)
        }
    }

    for ; curr.Le(stop); next() {
        if (curr.Ge(start) && curr.Le(startBreak)) || (curr.Ge(stopBreak) && curr.Le(stop)) {
            out = append(out, *curr.Copy())
        }
    }

    return out
}

Playground