2008-08-07 10 views
4

Ich habe eine Situation, in der ich Stunden zu einem Datum hinzufügen möchte und das neue Datum um den Arbeitstag wickeln lassen soll. Ich habe eine Funktion entwickelt, um dieses neue Datum zu bestimmen, aber ich möchte sicherstellen, dass ich nichts vergesse.Was ist der beste Weg, die Zeit am Arbeitstag zu verbringen?

Die hinzuzufügenden Stunden werden "Verzögerung" genannt. Es könnte leicht ein Parameter für die Funktion sein.

Bitte posten Sie irgendwelche Vorschläge. [VB.NET Warning]

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 

Hinweis: Dies wird wahrscheinlich nicht funktionieren, wenn Verzögerung mehr als 9 Stunden lang. Es sollte nie von 3 bis durchgehen.

EDIT: Das Ziel ist, das Datum und die Uhrzeit zu finden, die Sie durch das Hinzufügen mehrerer Stunden zur aktuellen Uhrzeit erhalten. Dies wird verwendet, um einen Standardwert für ein Fälligkeitsdatum einer Einreichung zu bestimmen. Ich möchte 3 Stunden zur aktuellen Zeit hinzufügen, um die Fälligkeitszeit zu erhalten. Ich möchte jedoch keine Fälligkeiten, die am heutigen Tag über 17 Uhr hinausgehen. Also habe ich versucht, die Stunden zwischen (heute, bis 17 Uhr) und (morgen, ab 8 Uhr morgens) zu teilen, so dass das Hinzufügen von 3 Stunden bis 4 Uhr 19 Uhr geben würde, weil 1 Stunde bis zum Ende von heute und 2 addiert wird Stunden werden zu Beginn von morgen hinzugefügt.

Antwort

2

Sie sollten wahrscheinlich einige automatisierte Tests für jede denkbare Bedingung schreiben und dann einfach weiter brainstormieren und die Tests so schreiben, wie Sie sie denken. Auf diese Weise können Sie sicher sein, dass es funktioniert, und es wird weiter funktionieren, wenn Sie weitere Änderungen vornehmen. Sehen Sie sich Test Driven Development an, wenn Ihnen die Ergebnisse gefallen.

+0

Dies ist nicht die Antwort, aber es ist ein upvote. –

2

Okay, was ist mit diesen? Der Unterschied zwischen den Ansätzen sollte für sich sprechen.

Auch das wird getestet, soweit ich es werfen kann. Die Garantie dauert bis ... jetzt.

Hoffe es hilft!

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

Ich habe mit der folgenden Formel (Pseudo-Code) mit einigem Erfolg gearbeitet:

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

Ich suchte nach einer Möglichkeit, eine Modulus-Operation in dieses Problem zu integrieren. Cooles Zeug. – EndangeredMassa