2017-10-21 38 views
1

我控制一个服务,可以将Weekday - > Time(也是time.Time格式)存储到一个MongoDB中,用于社区中的事件。我目前遇到的问题是试图将这些平日展开为以下内容。使用时间包翻转到以下Weekday

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

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

到目前为止,我已经尝试将星期几转换为整数(我知道time.Weekday()已经这样做了)然后执行数学来获得天数。然后使用time.Date()来设置下一个事件。当前:The Go Playground

我有一个巨大的头痛,我认为我过度思考和缺少超级简单的东西。我已经检查了time package文档,没有真正为我弹出。我不担心打印或存储数据,只是得到适当的计算和操作时间包。

回答

0

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

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

+0

这正是我所期待的:基于周日的滚动。 感谢您的输入和启发我! – d0x1p2

0

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

另一种方法是有一个每天按计划运行的清扫机(您的滴答计时器),它可以在过去7天后递增旧事件。如果今天发生这种情况,您可能仍需要检查是否已经过去或过于接近用户。

+0

感谢您的输入,这是更简单的两种解决方案,我得记住这一点。我知道我错过了一些简单的...添加7.再次感谢,现在我感到羞愧自己哈哈。 – d0x1p2