2008-08-07 27 views
4

Je suis dans une situation où je souhaite ajouter des heures à une date et faire en sorte que la nouvelle date soit ajoutée à la journée de travail. J'ai bricolé une fonction pour déterminer cette nouvelle date, mais je veux m'assurer que je n'oublie rien.Quelle est la meilleure façon d'emballer le temps autour de la journée de travail?

Les heures à ajouter sont appelées "délai". Il pourrait facilement être un paramètre de la fonction à la place.

Veuillez envoyer vos suggestions. [Avertissement VB.NET]

Private Function GetDateRequired() As Date 
    ''// A decimal representation of the current hour 
    Dim hours As Decimal = Decimal.Parse(Date.Now.Hour) + (Decimal.Parse(Date.Now.Minute)/60.0) 

    Dim delay As Decimal = 3.0   ''// delay in hours 
    Dim endOfDay As Decimal = 12.0 + 5.0 ''// end of day, in hours 
    Dim startOfDay As Decimal = 8.0  ''// start of day, in hours 

    Dim newHour As Integer 
    Dim newMinute As Integer 

    Dim dateRequired As Date = Now 
    Dim delta As Decimal = hours + delay 

    ''// Wrap around to the next day, if necessary 
    If delta > endOfDay Then 
     delta = delta - endOfDay 
     dateRequired = dateRequired.AddDays(1) 

     newHour = Integer.Parse(Decimal.Truncate(delta)) 
     newMinute = Integer.Parse(Decimal.Truncate((delta - newHour) * 60)) 
     newHour = startOfDay + newHour 
    Else 
     newHour = Integer.Parse(Decimal.Truncate(delta)) 
     newMinute = Integer.Parse(Decimal.Truncate((delta - newHour) * 60)) 
    End If 

    dateRequired = New Date(dateRequired.Year, dateRequired.Month, dateRequired.Day, newHour, newMinute, 0) 

    Return dateRequired 
End Sub 

Remarque: Cela ne fonctionnera probablement pas si le délai est plus de 9 heures. Il ne devrait jamais changer de 3, à travers.

EDIT: Le but est de trouver la date et l'heure que vous obtenez à la suite de l'ajout de plusieurs heures à l'heure actuelle. Ceci est utilisé pour déterminer une valeur par défaut pour une date d'échéance d'une soumission. Je veux ajouter 3 heures à l'heure actuelle pour obtenir la date d'échéance. Cependant, je ne veux pas de dates d'échéance qui dépassent 17h le jour actuel. J'ai donc essayé de répartir les heures entre (aujourd'hui, jusqu'à 17 heures) et (demain, à partir de 8 heures), de sorte que l'ajout de 3 heures à 16 heures vous donnerait 19 heures, car 1 heure est ajoutée à la fin d'aujourd'hui et 2 heures les heures sont ajoutées au début de demain.

Répondre

2

Vous devriez probablement écrire des tests automatisés pour chaque condition que vous pouvez imaginer, puis commencer à faire un brainstorming en écrivant les tests en fonction d'eux. De cette façon, vous pouvez voir avec certitude que cela fonctionnera, et continuera à fonctionner si vous faites d'autres changements. Recherchez Test Driven Development si vous aimez les résultats.

+0

Ce n'est pas la réponse, mais il est un upvote. –

2

Ok, qu'en pensez-vous? La différence entre les approches devrait parler d'elles-mêmes.

En outre, cela est testé sur autant que je peux le jeter. La garantie dure jusqu'à ... maintenant.

J'espère que ça aide!

Module Module1 

    Public Function IsInBusinessHours(ByVal d As Date) As Boolean 
     Return Not (d.Hour < 8 OrElse d.Hour > 17 OrElse d.DayOfWeek = DayOfWeek.Saturday OrElse d.DayOfWeek = DayOfWeek.Sunday) 
    End Function 


    Public Function AddInBusinessHours(ByVal fromDate As Date, ByVal hours As Integer) As Date 
     Dim work As Date = fromDate.AddHours(hours) 
     While Not IsInBusinessHours(work) 
      work = work.AddHours(1) 
     End While 
     Return work 
    End Function 


    Public Function LoopInBusinessHours(ByVal fromDate As Date, ByVal hours As Integer) As Date 
     Dim work As Date = fromDate 
     While hours > 0 
      While hours > 0 AndAlso IsInBusinessHours(work) 
       work = work.AddHours(1) 
       hours -= 1 
      End While 
      While Not IsInBusinessHours(work) 
       work = work.AddHours(1) 
      End While 
     End While 
     Return work 
    End Function 

    Sub Main() 
     Dim test As Date = New Date(2008, 8, 8, 15, 0, 0) 
     Dim hours As Integer = 5 
     Console.WriteLine("Date: " + test.ToString() + ", " + hours.ToString()) 
     Console.WriteLine("Just skipping: " + AddInBusinessHours(test, hours)) 
     Console.WriteLine("Looping: " + LoopInBusinessHours(test, hours)) 
     Console.ReadLine() 
    End Sub 

End Module 
1

J'ai travaillé avec la formule suivante (pseudo-code) avec un certain succès:

now <- number of minutes since the work day started 
delay <- number of minutes in the delay 
day <- length of a work day in minutes 

x <- (now + delay)/day {integer division} 
y <- (now + delay) % day {modulo remainder} 

return startoftoday + x {in days} + y {in minutes} 
+0

Je cherchais un moyen de travailler une opération de module dans ce problème. Truc cool. – EndangeredMassa