datetime - 如何获得一片元组(小时,分钟)

标签 datetime go time tuples slice

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

我有一份 session 记录 list :

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

还有四个参数:start, startBreak, stop, stopBreak:

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"

我想使用 minutes slice 中的所有分钟来获取元组 (hour, minutes) 的 slice ,并且它们不能包含在 范围内startBreak-stopBreak(可以等于startBreakstopBreak,所以范围会变成12:30, 13:00, 13:30 , 14:00) 和stop-start (可以等于startstop,所以范围会变成21:30、22:00、22:30、...、8:30、9:00)。

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

9:30, 10:00, 10:30, 11:00, 11:30, 12:00, 14:30, 15:00, 15:30, 16:00, 16:30, 17:00, 17:30, 18:00, 18:30, 19:00, 19:30, 20:00, 20:30, 21:00

最佳答案

这是演示这一点的最小代码,我没有进行任何数据验证。

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

关于datetime - 如何获得一片元组(小时,分钟),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53360290/

相关文章:

python - time.sleep在无限while循环内仅一部分代码

mysql - 在 MySql 中保存日期值

javascript - 使用 date.js 时无法正确格式化日期

ssl - 如何在原生 Go 中将 PEM 证书链转换为 PKCS7?

google-app-engine - 使用 golang 中的接口(interface)避免代码重复

Javascript 添加时间

java - 使用 asm Instrumentation 测量 java 程序运行时间

c# - 尝试使用 "Input string was not in a correct format"显示小时部分时出现 'h' 错误

C# 日期时间数组

go - 测试使用 time.Ticker 的代码的正确方法?