Hallo!
Anhand der Vorgaben habe ich das einmal umgesetzt.
Die Hilfs-Funktion "GetDateTimeFromDTP" erwartet als ersten
Parameter ein DateTimePicker-Control, dem das Datum
entnommen wird, als zweiten Parameter eine Date-Variable
die die Tagesuhrzeit enthält. Zurückgegeben wird ein
Date-Wert, der Datum und Uhrzeit zusammengefügt enthält.
Die Routine Zeitdifferenz übernimmt zwei Zeitpunkte
(jeweils bestehend aus Datum und Uhrzeit) und berechnet
die Länge der Perioden (in Stunden).
Bei ungeeigneten Eingaben werden Ausnahmen ausgelöst.
Private Function GetDateTimeFromDTP _
(ByVal dtp As DateTimePicker, ByVal TimeOfDay As Date) As Date
'Datum aus Picker lesen und TimeOfDay als Tages-Uhrzeit eintragen
Dim Datum As Date = dtp.Value
Datum = Datum.Subtract(Datum.TimeOfDay)
Dim ts As New TimeSpan(TimeOfDay.Hour, TimeOfDay.Minute, 0)
Return Datum.Add(ts)
End Function
''' <summary>Bestimmung einer Zeitdifferenz (auf 30 min gerundete Werte)</summary>
''' <param name="StartZeitpunkt">Startzeitpunkt Datum Stunde:Minute, auf 30
' min gerundet</param>
''' <param name="EndZeitpunkt">Endzeitpunkt Datum Stunde:Minute, auf 30 min
' gerundet</param>
''' <param name="Stunden_Periode1">Anzahl Stunden in Periode 1</param>
''' <param name="Stunden_Periode2">Anzahl Stunden in Periode 2</param>
Private Sub Zeitdifferenz(ByVal StartZeitpunkt As Date, _
ByVal EndZeitpunkt As Date, _
ByRef Stunden_Periode1 As Double, ByRef Stunden_Periode2 As Double)
Dim p1s As Integer = 420 'Tagesminute für 07:00 = Start Periode 1
Dim p1e As Integer = 1350 'Tagesminute für 22:30 = Ende Periode 1
Dim zeitpunkt As Date = StartZeitpunkt
Dim tm As Integer 'laufende Tagesminute
If StartZeitpunkt.Minute Mod 30 <> 0 Or _
EndZeitpunkt.Minute Mod 30 <> 0 Then
Throw New System.ArgumentException _
("Zeitangabe nicht korrekt gerundet")
End If
If StartZeitpunkt.Ticks > EndZeitpunkt.Ticks Then
Throw New System.ArgumentException _
("Ungültige (negative) Zeitdifferenz")
End If
Stunden_Periode1 = 0 : Stunden_Periode2 = 0 'Rückgabe initialisieren
'Keine Zeitdifferenz?
If StartZeitpunkt.Ticks = EndZeitpunkt.Ticks Then Exit Sub
'Zeitschleife bis zur Endzeit
While zeitpunkt < EndZeitpunkt
'Bestimmung akt. Tagesminute
tm = zeitpunkt.Hour * 60 + zeitpunkt.Minute
If tm >= p1s And tm <= p1e Then
Stunden_Periode1 += 0.5# 'halbe Stunde in Periode 1
Else
Stunden_Periode2 += 0.5# 'halbe Stunde in Periode 2
End If
zeitpunkt = zeitpunkt.AddMinutes(30) '30 Minuten addieren
End While
End Sub Anwendung (Annahme: dtpStartDatum, dtpEndDatum sind
DateTimePicker-Controls mit Datumsangaben,
StartUhrZeit, EndUhrZeit sind String-Variable,
die die Uhrzeitangaben enthalten).
Die Double-Variablen Stunden_Periode1/2 enthalten die
errechneten Stunden-Werte für das Zeitintervall.
Dim stunden_periode1, stunden_periode2 As Double
Zeitdifferenz(GetDateTimeFromDTP(dtpStartDatum, CDate(StartUhrZeit)), _
GetDateTimeFromDTP(dtpEnddatum, CDate(EndUhrZeit)), _
Stunden_Periode1, Stunden_Periode2) Die Zeitangaben müssen mit den Windows-Einstellungen für
die Zeitformate korrespondieren.
Beitrag wurde zuletzt am 05.04.10 um 01:47:13 editiert. |