2009-08-01 7 views
2

J'ai une exigence qui va comme suit (croyez-moi, je suis trop vieux pour les devoirs sourire)tâche Calculer les heures de début

J'ai un tas de tâches qui fonctionnent avec des fréquences différentes. Ils ont aussi une date de départ "seed". La graine de départ est quelquefois dans le passé, pourrait être il y a une minute, pourrait être il y a 5 ans. Je dois calculer le temps d'exécution suivant pour la tâche, en utilisant la date et l'heure de début et la fréquence - il ne peut pas simplement être "maintenant" + la fréquence de la tâche (pour ceux qui ont des tâches planifiées sur MS SQL Serveur c'est un concept familier)

Maintenant, la manière stupide de le faire est de prendre le départ de départ et continuer à ajouter la fréquence jusqu'à ce qu'il devienne plus grand que "maintenant". Ce n'est guère optimal. La façon naïve de le faire serait de prendre la date de départ, de la changer à la date d'aujourd'hui et de laisser l'heure telle quelle, puis d'ajouter la fréquence jusqu'à ce qu'elle soit plus grande que maintenant, mais cela suppose que la fréquence est un multiple de 24 heures.

Alors, quel est le meilleur moyen de le faire? Points bonus pour une solution C#, mais cela est assez générique pour faire un puzzle intéressant pour n'importe quelle langue :)

Répondre

6

Une meilleure méthode serait de prendre la différence entre l'horodatage de début et l'horodatage actuel, diviser cela par la fréquence, arrondissez le multiplicateur résultant jusqu'à l'entier le plus proche, multipliez de nouveau par la fréquence et ajoutez-le à l'horodatage de début une fois de plus.

Le fait d'arrondir vers le haut fournira le décalage approprié.

+0

Ceci n'est rien de moins que de la magie noire. Incroyable. –

0

Votre réponse serait essentiellement ceci:

next_time = ceiling((now - seed)/frequency) * frequency + seed 

Utilisation de la fonction de plafond garantit que next_time sera> = maintenant.

Vous auriez à faire les conversions nécessaires pour être en mesure d'effectuer cette arithmétique sur les dates (par exemple, la traduction en temps UNIX, qui est le nombre de secondes depuis le 1er janvier 1970.)

Je ne connais pas avec C# donc je ne peux pas offrir le code, mais je suppose que C# a des classes utilitaires de date/heure pour traiter les opérations arithmétiques de date/heure.

+0

Vous avez un paren supplémentaire après la fréquence. –

+0

Merci, l'a réparé. – alanlcode

0

puzzle intéressant, merci pour le défi :)

Cela devrait le faire en C#. Pourrait certainement être réduit, mais assez verbeux pour expliquer ce qui se passe.

// Initialise with date the event started, and frequency 
DateTime startDate = new DateTime(2009, 8,1,9,0,0); 
TimeSpan frequency = new TimeSpan(0, 15, 0); 

// Store datetime now (so that it doesnt alter during following calculations) 
DateTime now = DateTime.Now; 

// Calculate the number of ticks that have occured since the event started 
TimeSpan pastTimeSpan = now.Subtract(startDate); 

// Divide the period that the event has been running by the frequency 
// Take the remaining time span 
TimeSpan remainingTimeSpan = new TimeSpan(pastTimeSpan.Ticks % frequency.Ticks); 

// Calculate last occurence the event ran 
DateTime lastOccurence = now.Subtract(remainingTimeSpan); 

// Calculate next occurence the event will run 
DateTime nextOccurence = lastOccurence.Add(frequency); 
Questions connexes