algorithm - 如何编写一个函数来检查当前时间是否在时间窗口内

标签 algorithm go

我正在尝试找到一种方法来检查当前时间是否在时间窗口内。
输入是:upgradeDay []string - 几天(例如 ["Sunday", "Tuesday"] )upgradetime string - 小时:分钟(例如 "22:04" )upgradeDuration int64 - 时间量,来自 upgradetime时间窗口有效的时间。最长可达 12 小时。
完整示例:upgradeDay = ["Sunday", Tuesday"] , upgradetime = "10:00", upgradeDuration = 2 -> 时间窗口是每个星期日和星期二,从 10:00 到 12:00 点。
我尝试编写以下函数,但它在天/月/年之间的转换中不起作用:

func isInsideTimeWindow(upgradeDay []string, upgradeTime string, upgradeDuration int64) bool {
    now := time.Now()

    ut := strings.Split(upgradeTime, ":")
    hour, _ := strconv.Atoi(ut[0])
    min, _ := strconv.Atoi(ut[1])

    // !! not working when now it's Monday 00:01 and got: upgradeDay = ["Sunday"], upgradeTime = 23:59, upgradeDuration = 2
    twStart := time.Date(now.Year(), now.Month(), now.Day(), hour, min, 0, 0, now.Location())
    twEnd := twStart.Add(time.Hour * time.Duration(upgradeDuration))


    if !(now.After(twStart) && now.Before(twEnd)) {
        return false
    }
    
    wd := now.Weekday().String()
    
    for i := range upgradeDay {
      if upgradeDay[i] == wd  {
         return true
      }
    }
    
    return false
}
有人知道如何在 Go 中解决这个问题吗?

最佳答案

这是解决问题的一种方法:

package main
import "time"
type window struct { time.Time }

func (w window) isDay(s string) bool {
   return w.Weekday().String() == s
}

func (w window) isHourRange(begin, end int) bool {
   return w.Hour() >= begin && w.Hour() <= end
}

func main() {
   w := window{
      time.Now(),
   }
   {
      b := w.isDay("Friday")
      println(b)
   }
   {
      b := w.isHourRange(20, 23)
      println(b)
   }
}
这假设只有一天是有效的,所以你需要修改它来处理
多天。不过,这应该可以帮助您入门。

关于algorithm - 如何编写一个函数来检查当前时间是否在时间窗口内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63757342/

相关文章:

go - http.Post 无法正常工作?

go - 为工作协程排队项目的正确方法?

go - 推迟使用说明

algorithm - 解析 GIF 栅格数据 - LZW

algorithm - 模拟退火 - 传感器网络中的传感器定位

algorithm - 常量内存库采样,O(k) 可能吗?

algorithm - 基本排序运行时间比较

json - 使用重复字段解码 JSON

java - 如何正确使用 Mod 10^9+7

Golang 意外的 EOF