Freitag, 29. Januar 2010

Datumsspielereien (Teil 6) / Date gadgets (Part 6)

Datumsberechnungen und kein Ende :-)

Vor ein paar Tagen fiel mir mal wieder das leidige Thema MESZ ein. Ähnlich wie bei Ostern hatte ich mir nie wirklich Gedanken darum gemacht, wann denn nun das nächste Mal die Uhrzeit umgestellt wird. Windows wird es schon richten und ich würde mich wieder zwei Wochen lang mit der Zeitverschiebung rumschlagen... ;-)

Ein kurzer Blick in die Wikipedia und schon wußte ich: Es sind (mittlerweile europaweit) zwei Fixtermine, nämlich jeweils der letzte Sonntag im März und im Oktober. Und schon überlegte ich, wie man diese beiden Tage wohl im Fux berechnet...

Im folgenden also der kurze Mustercode auf Basis einer kleinen Funktion:

CLEAR
?GetLastSundayOfMonth({15/03/2010})
?GetLastSundayOfMonth()

FUNCTION GetLastSundayOfMonth as Date
LPARAMETERS vDate as Date

    * // Sicherstellen, dass wir ein Datum  
    * // zur Berechnung verfügbar haben      
    vDate = EVL(vDate,DATE())
    * // nun setzen wir das übergebene Datum
    * // auf den 1. Tag des Folgemonats     
    * // Korrektur gem. Gustavs Hinweis, da mein Originalcode
    * // einen Jahreswechsel zum Folgemonat nicht berücksichtigte
    vDate = DATE(YEAR(GOMONTH(vDate,1)),MONTH(GOMONTH(vDate,1)),1)
    * // Abschliessend geben wir das Datum  
    * // um den Wochentag reduziert zurück.  
    * // Dies ergibt automatisch den voran-  
    * // gegangenen Sonntag.              
    RETURN vDate - DOW(vDate,2)

ENDFUNC

2 Kommentare:

  1. Hallo,

    ist leider nicht ganz richtig...
    wenn z.B. vDate nun der 31.12 wäre, würde es bei denen Zeilen ein Fehler geben...

    hier mal die richtige Version


    FUNCTION GetLastSundayOfMonth as Date
    LPARAMETERS vDate as Date

    * // Sicherstellen, dass wir ein Datum
    * // zur Berechnung verfügbar haben
    vDate = EVL(vDate,DATE())
    * // nun setzen wir das übergebene Datum
    * // auf den 1. Tag des Folgemonats
    vDate = DATE(YEAR(GOMONTH(vDate,1)),MONTH(GOMONTH(vDate,1)),1)
    * // Abschliessend geben wir das Datum
    * // um den Wochentag reduziert zurück.
    * // Dies ergibt automatisch den voran-
    * // gegangenen Sonntag.
    RETURN vDate - DOW(vDate,2)

    ENDFUNC

    AntwortenLöschen
  2. Hallo Gustav,

    danke für die Info. An einen Jahreswechsel hatte ich in Hinblick auf die Sommerzeitfrage gar nicht gedacht. Ich werde den Code im Blogeintrag entsprechend korrigieren!!

    AntwortenLöschen