使用Time Package翻转到下周的工作日

时间:2017-10-21 09:10:33

标签: go time

我控制了一个能够存储工作日的服务 - >时间(也是时间。时间格式)到社区中的事件的MongoDB中。我目前遇到的问题是试图将这些工作日转为以下内容。

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

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

到目前为止,我已经尝试将工作日转换为整数(我知道时间.Weekday()已经这样做了)然后执行数学试图获得天数。然后使用time.Date()设置下一个匹配项。目前:The Go Playground

我头疼得厉害,我觉得自己过分思考,错过了一些非常简单的事情。我查看了time package文档,并没有真正为我弹出。我并不担心打印或存储数据,只是进行正确的计算和操作时间包。

2 个答案:

答案 0 :(得分:1)

以下是从现在开始每周活动的第二天的示例。如果这不是您想要的,请在您的问题中添加一些测试示例。

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

游乐场:https://play.golang.org/p/m1rYD72-nx

答案 1 :(得分:0)

在此之前获取事件列表,以及之后的事件列表。您可以按原样呈现的事件,您之前的事件可以将7天的倍数添加到其原始时间,直到它们在今天和现在之后(可能将它们保存以供将来参考)。

另一种方法是让清扫车每天按计划运行(您的计时器),它将旧事件从刚刚过去的那天起增加7天。如果今天发生这种情况,您可能仍需要检查他们是否已经过去或过于接近用户。