Wochentag(e) nach Datum umwandeln

    • 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
    [autoit]


    #include <Array.au3> ; wird für die Funktion benötigt
    #include <Date.au3> ; wird für die Funktion benötigt

    [/autoit] [autoit][/autoit] [autoit]

    ; 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-

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; 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

    [/autoit]

    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. :)

  • GENIAL !!!!

    Männeranwendungsbeispiel:
    "PC, sag mir 3 Tage vor dem Hochzeitstag, das ich Rosen für meine Frau bestellen muß" :rofl:

    Frauenanwendungsbeispiel:
    Da fällt mir sicherlich mal was spontan ein ;):rofl:;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl