go - 使用时间包滚动到下一个工作日

标签 go time

我控制一项服务,该服务能够将工作日 -> 时间(也是 time.Time 格式)存储到 MongoDB 中以用于社区中的事件。我目前遇到的问题是尝试将这些工作日转到以下时间。

假设每周三中午 12:00 有一个事件。一旦当前工作日是星期四 - 我需要在星期三 12:00 将时间对象滚动到下一周并存储它。

没有滴答作响的计时器。当有人试图查询所有当前事件时——我希望它检查事件是否已经过去,如果是,则更新到下一个事件并显示当前事件。如果我使用的是持久性计时器,只需将 7 天添加到 time.AddDate() 或 time.Date() 即可轻松实现翻转。

到目前为止,我已经尝试将工作日转换为整数(我知道 time.Weekday() 已经这样做了)然后执行数学运算以尝试获取天数。然后使用 time.Date() 设置下一次出现。当前:The Go Playground

我头疼得很厉害,我想我想多了,漏掉了一些非常简单的东西。我检查了 time package文档并没有真正为我弹出。我不担心打印或存储数据,只需进行正确的计算并操纵时间包。

最佳答案

这是一个从现在开始的第二天获取每周事件的示例。如果这不是您想要的,请在您的问题中添加一些测试示例。

package main

import (
    "fmt"
    "time"
)

func nextWeeklyEvent(t time.Time, weekday time.Weekday, hour, minute int) time.Time {
    days := int((7 + (weekday - t.Weekday())) % 7)
    y, m, d := t.AddDate(0, 0, days).Date()
    return time.Date(y, m, d, hour, minute, 0, 0, t.Location())
}

func main() {
    now := time.Now().Round(time.Second)
    for i := 0; i < +7; i++ {
        next := nextWeeklyEvent(now, time.Wednesday, 12, 0)
        fmt.Println("now: ", now, now.Weekday())
        fmt.Println("next:", next, next.Weekday())
        fmt.Println()
        now = now.AddDate(0, 0, 1)
    }
}

输出:

now:  2017-10-21 14:30:17 -0400 EDT Saturday
next: 2017-10-25 12:00:00 -0400 EDT Wednesday

now:  2017-10-22 14:30:17 -0400 EDT Sunday
next: 2017-10-25 12:00:00 -0400 EDT Wednesday

now:  2017-10-23 14:30:17 -0400 EDT Monday
next: 2017-10-25 12:00:00 -0400 EDT Wednesday

now:  2017-10-24 14:30:17 -0400 EDT Tuesday
next: 2017-10-25 12:00:00 -0400 EDT Wednesday

now:  2017-10-25 14:30:17 -0400 EDT Wednesday
next: 2017-10-25 12:00:00 -0400 EDT Wednesday

now:  2017-10-26 14:30:17 -0400 EDT Thursday
next: 2017-11-01 12:00:00 -0400 EDT Wednesday

now:  2017-10-27 14:30:17 -0400 EDT Friday
next: 2017-11-01 12:00:00 -0400 EDT Wednesday

Playground :https://play.golang.org/p/m1rYD72-nx

关于go - 使用时间包滚动到下一个工作日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46861744/

相关文章:

r - 计算就寝时间的平均值和标准差 (hh :mm) in R - problem are times before/after midnight

http - golang `Host` 的 `URL.Host` 和 `http.Request` 有什么区别?

go - 将 JSON 解码为接口(interface)值

在应用程序的每个模块中对错误(常量错误)进行分组的好方法

iPhone:如何修复基于更改设备日期的作弊行为?有服务器可以获取时间吗?

c - 确保程序只运行 N 秒

SQL Count 不同的时间,相差 30 分钟

python - pymongo 单次插入太慢,尽管 WriteConcern(w=0)

go - 使用 Go 模块时如何获得依赖项的主分支

arrays - 将 json 文件编码到 map 中