2017-10-21 7 views
1

je contrôle un service qui a la capacité de stocker Weekday -> Time (également au format time.time) dans un MongoDB pour les événements dans une communauté. Le problème que je suis actuellement en train d'essayer de passer ces jours de la semaine à ce qui suit.Utilisation du Kit temps de retournement à suivre Weekday

Dites tous les mercredis à 12:00 il y a un événement. Une fois que le jour de la semaine actuel est jeudi, je dois faire rouler l'objet horaire à la semaine suivante à midi mercredi et le stocker.

Il n'y a pas de temporisateur de délai. Lorsque quelqu'un tente d'interroger tous les événements en cours, je voudrais qu'il vérifie si l'événement est passé, et si c'est le cas, mettez à jour le suivant et affichez le courant. Si j'utilisais un timer persistant, le rollover serait facile en ajoutant juste 7 jours à time.AddDate() ou time.Date().

Jusqu'à présent, je l'ai essayé de convertir la semaine en nombres entiers (je suis au courant time.Weekday() fait déjà fait) puis effectuer les mathématiques pour essayer d'obtenir le nombre de jours. Ensuite, utilisez time.Date() pour définir l'occurrence suivante. Courant: The Go Playground

J'ai un énorme mal de tête et je pense que je suis Overthinking et manque quelque chose super simple. J'ai vérifié la documentation de time package et rien ne s'est vraiment passé pour moi. Je ne suis pas inquiet à propos de l'impression ou du stockage des données, juste pour obtenir les bons calculs et manipuler le paquet de temps.

Répondre

0

Voici un exemple pour obtenir le lendemain à partir de maintenant pour un événement hebdomadaire. Si ce n'est pas ce que vous voulez, ajoutez quelques exemples de test à votre question.

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) 
    } 
} 

Sortie:

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

+0

C'est exactement ce que je cherchais: Rolling over basé sur le jour de la semaine. Merci pour votre contribution et pour m'avoir éclairé! – d0x1p2

0

obtenir une liste des événements avant maintenant, et une liste des événements après. Les événements après que vous pouvez présenter comme ils sont, les événements avant que vous pouvez ajouter des multiples de 7 jours à leur heure d'origine jusqu'à ce qu'ils soient après aujourd'hui et présent (probablement en les enregistrant pour l'avenir aussi).

Une autre approche serait d'avoir une balayeuse qui circule tous les jours sur un calendrier (votre minuterie à retardement) qui incrémente les anciens événements de 7 jours à compter du jour juste après. Vous devrez peut-être vérifier lors de la présentation si elles étaient déjà passées ou trop près d'arriver à l'utilisateur si cela se produit aujourd'hui.

+0

Merci pour vos commentaires, cela est plus simple des deux solutions et je vais devoir garder cela à l'esprit. Je savais qu'il me manquait quelque chose de simple ... en ajoutant 7. Merci encore et maintenant j'ai honte de moi. – d0x1p2