- Offizieller Beitrag
Für ein Projekt brauchte ich gerade eine Funktion zum umwandeln von Wochentagen (Mo, Di, Mi usw.) in das konkrete Datum (Format: 2009/08/13). Dabei sollte man auch Wochentagsintervalle (z.B. Mo-Fr) angeben können.
Es gibt die Möglichkeit vom Bezugsdatum aus in der Vergangenheit ($bTime = False) oder in der Zukunft ($bTime = True) die Daten ausgeben zu lassen.
Naja, rausgekommen ist diese Funktion:
Spoiler anzeigen
#include <Array.au3> ; wird für die Funktion benötigt
#include <Date.au3> ; wird für die Funktion benötigt
; Beispiele -Anfang-
$aDate = _DayIntervalToDateArray('Mo-Sa')
_ArrayDisplay($aDate, 'Intervall = Mo-Sa')
$aDate = _DayIntervalToDateArray('MI.-fr.', False)
_ArrayDisplay($aDate, 'Intervall = MI.-fr.')
$aDate = _DayIntervalToDateArray('Do.')
_ArrayDisplay($aDate, 'Intervall = Do.')
$aDate = _DayIntervalToDateArray('Do.', False)
_ArrayDisplay($aDate, 'Intervall = letzter Do.')
$aDate = _DayIntervalToDateArray('So.', False, 2009, 12, 24) ; gesucht: Sonntag vor Heiligabend
_ArrayDisplay($aDate, 'Intervall = So. vor Heiligabend')
; Beispiele -Ende-
;===============================================================================
; Function Name: _DayIntervalToDateArray($sInterval[, $bTime = True][, $iYear = @YEAR][, $iMonth = @MON][, $iDay = @MDAY])
; Description:: gibt ein Array mit Daten zurück, die dem übergebenen Wochentagsintervall entsprechen
; Parameter(s): $sIntervall = Wochentag oder ein Intervall (von...bis)
; $bTime = False (Vergangenheit) oder True (Zukunft)
; $iYear, $iMonth, $iDay = Falls man ein anderes Bezugsdatum angeben will
; Requirement(s): #include <Array.au3>
; #include <Date.au3>
; Return Value(s): nullbasiertes Array
; im Fehlerfall: Rückgabe = "0" und @error = 1
; Author(s): Oscar (http://www.autoit.de)
;===============================================================================
Func _DayIntervalToDateArray($sInterval, $bTime = True, $iYear = @YEAR, $iMonth = @MON, $iDay = @MDAY)
Local $aInterval = StringSplit($sInterval, '-')
If $aInterval[0] > 2 Then Return SetError(1, 0, 0)
Local $aWeekDay[7][2] = [['Mo', 0],['Di', 1],['Mi', 2],['Do', 3],['Fr', 4],['Sa', 5],['So', 6]]
Local $aDay[2] = [-1, -1], $aDate[1], $iDateSub, $iTimeFormat
For $i = 1 To $aInterval[0]
For $j = 0 To UBound($aWeekDay) - 1
If StringInStr($aInterval[$i], $aWeekDay[$j][0]) Then
$aDay[$i - 1] = $aWeekDay[$j][1]
ExitLoop
EndIf
Next
Next
If $aDay[0] = -1 Then Return SetError(1, 0, 0)
If $aDay[1] > -1 Then ; Wenn ein "von-bis-Intervall" übergeben wurde, dann...
ReDim $aDate[$aDay[1] - $aDay[0] + 1]
For $i = 0 To $aDay[1] - $aDay[0] ; Alle Wochentage aus dem Intervall
$iDateSub = ($aWeekDay[$aDay[0] + $i][1] - 6) + (6 - _DateToDayOfWeekISO($iYear, $iMonth, $iDay)); (gesuchter Wochentag - 6) + (6 - heute)
If $bTime Then
If $iDateSub < 0 Then $iDateSub += 7 ; wenn der Wochentag kleiner heute, dann nächste Woche
Else
If $iDateSub >= 0 Then $iDateSub -= 7 ; wenn der Wochentag größer/gleich heute, dann letzte Woche
EndIf
$aDate[$i] = _DateAdd('D', $iDateSub, StringFormat('%04i/%02i/%02i', $iYear, $iMonth, $iDay)) ; Datum vom Wochentag ins Ausgabe-Array
Next
Else ; ansonsten wurde nur ein einzelner Wochentag übergeben
$iDateSub = ($aWeekDay[$aDay[0]][1] - 6) + (6 - _DateToDayOfWeekISO($iYear, $iMonth, $iDay)); (gesuchter Wochentag - 6) + (6 - heute)
If $bTime Then
If $iDateSub < 0 Then $iDateSub += 7 ; wenn der Wochentag kleiner heute, dann nächste Woche
Else
If $iDateSub >= 0 Then $iDateSub -= 7 ; wenn der Wochentag größer/gleich heute, dann letzte Woche
EndIf
$aDate[0] = _DateAdd('D', $iDateSub, StringFormat('%04i/%02i/%02i', $iYear, $iMonth, $iDay)) ; Datum vom Wochentag ins Ausgabe-Array
EndIf
_ArraySort($aDate) ; Ausgabe-Array sortieren
Return $aDate
EndFunc ;==>_DayIntervalToDateArray
Im Script sind diverse Beispiele aufgeführt, wie man die Funktion nutzen kann. Die Beispiele erklären die Funktion wohl besser, als 1000 Worte.
Vielleicht braucht ja noch jemand so eine Funktion.