DateEx.au3 ( _DateGetFormatted, _DateToDayNameLocale )

    • Offizieller Beitrag

    Hi,
    da ich bei Datenerfassung so wenig, wie möglich Aufwand haben will, möchte ich für Datumswerte auch die jeweils kürzeste Form der Eingabe ermöglichen. Die Umwandlung in das Standard-Datumsformat D10 (TT.MM.JJJJ) soll dann automatisch erfolgen. Beim Schreiben der Funktion fiel mir dann ein, dass manchmal die Ausgabe des Datums in den verschieden Kurz- und Langformen wünschenswert ist.
    Somit habe ich das alles in dieser Funktion vereint. Im Gegensatz zu Datumsfunktion in z.B. Office gibt es hier für die Jahrhunderterkennung keinen fixen Wert. Jeder zweistellige Jahreswert, der größer als der Jetztwert ist wird als 19xx betrachtet. Somit ist ein zweistellig eingegebenes Geburtsjahr von Personen mit einem Alter bis zu 99 Jahren auch immer korrekt. (Den Jahrhundert-Parameter habe ich jetzt mal nicht flexibel gemacht. Die Funktion ist in der Form über 80 Jahre gültig - was danach kommt interessiert mich nicht :D)
    Das Datum wird immer auf Gültigkeit geprüft.

    Edit 29.12.2012
    Habe das nochmal überarbeitet (mit "-1" für Datum wird das Heute-Datum verwendet (Standard); auch Eingabe des englischen Datumformats; Ausgabevarianten erweitert; Prüfung auf Datums-Gültigkeit erfolgt immer; Include der Date.au3 nicht mehr erforderlich).

    Eingabemöglichkeiten sind:

    • TTMMJJJJ
    • TTMMJJ
    • (T)T.(M)M.(JJ)JJ
    • YYYY/(M)M/(D)D


    Ausgabevarianten sind:

    • TT.MM.JJJJ ==> 29.12.2012 (Standard)
    • ttt, TT.MM.JJJJ ==> Sa, 29.12.2012
    • ttt, TT. mmm JJJJ ==> Sa, 29. Dez 2012
    • ttt, TT. mmmm JJJJ ==> Sa, 29. Dezember 2012
    • tttt, TT.MM.JJJJ ==> Samstag, 29.12.2012
    • tttt, TT. mmm JJJJ ==> Samstag, 29. Dez 2012
    • tttt, TT. mmmm JJJJ ==> Samstag, 29. Dezember 2012
      Array mit allen Formen [29,12,2012,Sa,Samstag,Dez,Dezember]
    _DateGetFormatted
    [autoit]


    ConsoleWrite(_DateGetFormatted() & @CRLF)
    ConsoleWrite(_DateGetFormatted(-1, 1) & @CRLF)
    ConsoleWrite(_DateGetFormatted('120510', 2) & @CRLF)
    ConsoleWrite(_DateGetFormatted('1.3.12', 3) & @CRLF)
    ConsoleWrite(_DateGetFormatted('18051920', 4) & @CRLF)
    ConsoleWrite(_DateGetFormatted('2012/3/31', 5) & @CRLF)
    ConsoleWrite(_DateGetFormatted('2012/06/05', 6) & @CRLF)

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

    #cs - Output
    29.12.2012
    Sa, 29.12.2012
    Mi, 12. Mai 2010
    Do, 01. März 2012
    Dienstag, 18.05.1920
    Samstag, 31. Mrz 2012
    Dienstag, 05. Juni 2012
    #ce

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

    ;===============================================================================
    ; Function Name....: _DateGetFormatted
    ; Description......: Gibt aus verschiedenen Eingabevarianten das Datum in
    ; .................: wählbaren Formaten zurück, Datum wird auf Gültigkeit geprüft.
    ; .................: Bei zweistelligem Jahr wird bei > akt. Jahr 19xx verwendet.
    ; Parameter(s).....: $_sDate Datums-String, folgende Eingaben sind möglich:
    ; .................: TTMMJJJJ
    ; .................: TTMMJJ
    ; .................: (T)T.(M)M.(JJ)JJ
    ; .................: YYYY/(M)M/(D)D
    ; .................: -1 =Heute (Standard)
    ; .................: $_iType Rückgabetyp, 0 = TT.MM.JJJJ ==> 29.12.2012 (Standard)
    ; .................: 1 = ttt, TT.MM.JJJJ ==> Sa, 29.12.2012
    ; .................: 2 = ttt, TT. mmm JJJJ ==> Sa, 29. Dez 2012
    ; .................: 3 = ttt, TT. mmmm JJJJ ==> Sa, 29. Dezember 2012
    ; .................: 4 = tttt, TT.MM.JJJJ ==> Samstag, 29.12.2012
    ; .................: 5 = tttt, TT. mmm JJJJ ==> Samstag, 29. Dez 2012
    ; .................: 6 = tttt, TT. mmmm JJJJ ==> Samstag, 29. Dezember 2012
    ; .................: 7 = Array mit allen Formen [29,12,2012,Sa,Samstag,Dez,Dezember]
    ; Return Value(s)..: Erfolg Datumsstring im gewählten Format od. Array mit allen mgl. Werten
    ; .................: Fehler Leerstring error = 1 Datumsstring fehlerhaft
    ; .................: error = 2 Datum ist ungültig
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _DateGetFormatted($_sDate=-1, $_iType=0)
    Local $sCentury = '20', $sRetDate, $aDate
    If $_sDate = -1 Then
    $sRetDate = @MDAY & '.' & @MON & '.' & @YEAR
    Else
    If StringInStr($_sDate, '.') Then
    $aDate = StringSplit($_sDate, '.')
    If $aDate[0] <> 3 Then Return SetError(1,0,'')
    $_sDate = StringRight('0' & $aDate[1], 2) & StringRight('0' & $aDate[2], 2) & $aDate[3]
    EndIf
    If StringInStr($_sDate, '/') Then
    $aDate = StringSplit($_sDate, '/')
    If $aDate[0] <> 3 Then Return SetError(1,0,'')
    $_sDate = StringRight('0' & $aDate[3], 2) & StringRight('0' & $aDate[2], 2) & $aDate[3]
    EndIf
    Switch StringLen($_sDate)
    Case 6
    If StringRight($_sDate, 2) > StringRight(@YEAR, 2) Then $sCentury = '19'
    $sRetDate = StringRegExpReplace($_sDate, '(\d{2})(\d{2})(\d{2})', '$1.$2.' & $sCentury & '$3')
    Case 8
    $sRetDate = StringRegExpReplace($_sDate, '(\d{2})(\d{2})(\d{4})', '$1.$2.$3')
    Case Else
    Return SetError(1,0,'')
    EndSwitch
    EndIf
    $aDate = StringRegExp($sRetDate, '(\d{2})\.(\d{2})\.(\d{4})', 3)
    If @error Then Return SetError(1,0,'')
    If $_iType > 7 Then $_iType = 0
    Local $tSYSTEMTIME = DllStructCreate("struct; word Year;word Month;word Dow;word Day;word Hour;word Minute;word Second;word MSeconds; endstruct")
    DllStructSetData($tSYSTEMTIME, 'Year', StringRight($sRetDate, 4))
    DllStructSetData($tSYSTEMTIME, 'Month', StringMid($sRetDate, 4, 2))
    DllStructSetData($tSYSTEMTIME, 'Day', StringLeft($sRetDate, 2))
    Local $sFormat, $tFormat = DllStructCreate('wchar[64];'), $tDateStr = DllStructCreate('wchar[64];')
    Switch $_iType
    Case 0 ; == nur Datum, z.B. "28.12.2012"
    $sFormat = "dd'.'MM'.'yyyy"
    Case 1 ; == Tag als Kürzel, z.B. "Fr, 28.12.2012"
    $sFormat = "ddd',' dd'.'MM'.'yyyy"
    Case 2 ; == Tag als Kürzel u. Monat als Kürzel, z.B. "Fr, 28. Dez 2012"
    $sFormat = "ddd',' dd'.' MMM yyyy"
    Case 3 ; == Tag als Kürzel u. Monat voll, z.B. "Fr, 28. Dezember 2012"
    $sFormat = "ddd',' dd'.' MMMM yyyy"
    Case 4 ; == Tag voll, z.B. "Freitag, 28.12.2012"
    $sFormat = "dddd',' dd'.'MM'.'yyyy"
    Case 5 ; == Tag voll u. Monat voll, z.B. "Freitag, 28. Dezember 2012"
    $sFormat = "dddd',' dd'.' MMM yyyy"
    Case 6 ; == Tag voll u. Monat als Kürzel, z.B. "Freitag, 28. Dez 2012"
    $sFormat = "dddd',' dd'.' MMMM yyyy"
    Case 7 ; == alle Kurz- und Langformen zur Rückgabe als Array
    $sFormat = "dd','MM','yyyy','ddd','dddd','MMM','MMMM"
    EndSwitch
    DllStructSetData($tFormat, 1, $sFormat)
    DllCall("kernel32", "long", "GetDateFormatW", "long", 0, "long", 0, _
    "ptr", DllStructGetPtr($tSYSTEMTIME), "ptr", DllStructGetPtr($tFormat), "ptr", DllStructGetPtr($tDateStr), "long", 64)
    Local $sRet = DllStructGetData($tDateStr, 1)
    If $sRet = '' Then Return SetError(2,0,'')
    If $_iType = 7 Then Return StringSplit($sRet, ',', 2)
    Return DllStructGetData($tDateStr, 1)
    EndFunc ;==>_DateGetFormatted

    [/autoit]

    ... und eine weitere Funktion hinzugefügt:
    _DateToDayNameLocale()
    Gibt zu einem Datum den Wochentag (Lang-/Kurzform) gemäß den lokalen Einstellungen (Ländereinstellung) zurück. D.h. der Wochentag wird immer gemäß den Einstellungen des Nutzer-PC angezeigt in der entsprechenden Landessprache.
    Eingabe des Datums als Einzelparameter (Jahr, Monat, Tag) + ein Parameter für den Typ (Lang-/Kurzform) oder als Datumsstring der Form: "(T)T.(M)M.(JJ)JJ", "YYYY/(M)M/(D)D"
    Wird das Datum als String übergeben, ist der zweite Parameter für den Typ zuständig.
    Standardmäßig ist der Parameter für Jahr/Datumsstring mit "-1" vorbelegt für das aktuelle Datum.

    _DateToDayNameLocale
    [autoit]


    ConsoleWrite(_DateToDayNameLocale() & @CRLF) ; == Wochentag Heute-lang
    ConsoleWrite(_DateToDayNameLocale(-1, 0) & @CRLF) ; == Wochentag Heute-kurz
    ; == Datum als String
    ConsoleWrite(_DateToDayNameLocale('29.12.12') & @CRLF) ; == Wochentag Datum deutsch TT.MM.JJ -lang
    ConsoleWrite(_DateToDayNameLocale('2.2.2012') & @CRLF) ; == Wochentag Datum deutsch T.M.JJJJ -lang
    ConsoleWrite(_DateToDayNameLocale('2012/12/29') & @CRLF) ; == Wochentag Datum englisch YYYY/MM/DD -lang
    ConsoleWrite(_DateToDayNameLocale('29.12.12', 0) & @CRLF) ; == Wochentag Datum deutsch TT.MM.JJ -kurz
    ConsoleWrite(_DateToDayNameLocale('1.3.09', 0) & @CRLF) ; == Wochentag Datum deutsch T.M.JJ -kurz
    ConsoleWrite(_DateToDayNameLocale('2012/2/9', 0) & @CRLF) ; == Wochentag Datum englisch YYYY/M/D -kurz
    ; == Datum als Einzelwerte
    ConsoleWrite(_DateToDayNameLocale(2012, 11, 30, 0) & @CRLF) ; == Wochentag -kurz
    ConsoleWrite(_DateToDayNameLocale(2012, 12, 29) & @CRLF) ; == Wochentag -lang
    ; == Test fehlerhaftes Datum
    $ret = _DateToDayNameLocale(2012, 11, 31, 0)
    ConsoleWrite('>' & $ret & '< @error: ' & @error & @CRLF)

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

    #cs - Output
    Samstag
    Sa
    Samstag
    Donnerstag
    Samstag
    Sa
    So
    Do
    Fr
    Samstag
    >< @error: 2
    #ce

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

    ;===============================================================================
    ; Function Name....: _DateToDayNameLocale
    ; Description......: Gibt zu einem Datum den Wochentag (Lang-/Kurzform) gemäß den lokalen
    ; .................: Einstellungen (Ländereinstellung) zurück
    ; Parameter(s).....: $_vDateYear Jahr oder String mit Datum der Formen:
    ; .................: "(T)T.(M)M.(JJ)JJ", "YYYY/(M)M/(D)D"
    ; .................: Standard= -1 aktuelles Tagesdatum
    ; .................: $_vLongMonth Monat oder wenn 1.Param=Datumsstring: Lang-/Kurzform (1/0)
    ; .................: $_iDay Tag (nur für Einzelwertübergabe, sonst 0)
    ; .................: $_iLong Lang-/Kurzform (1/0) des Tagesnamens, Standard=1
    ; Return Value(s)..: Erfolg Name Wochentag (lang od. kurz) nach lokalen Einstellungen
    ; .................: Fehler Leerstring set @error = 1 Datumsstring fehlerhaft
    ; .................: = 2 Datum ungültig
    ; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
    ;===============================================================================
    Func _DateToDayNameLocale($_vDateYear=-1, $_vLongMonth=1, $_iDay=0, $_iLong=1)
    Local $iDay = @MDAY, $iMon = @MON, $iYear = @YEAR, $aDate, $tmp
    If $_iDay <> 0 Then
    $iDay = $_iDay
    $iMon = $_vLongMonth
    $iYear = $_vDateYear
    Else
    $_iLong = $_vLongMonth
    If $_vDateYear <> -1 Then
    If StringInStr($_vDateYear, '.') Then
    $aDate = StringRegExp($_vDateYear, '(\d{1,2})\.(\d{1,2})\.(\d{2,4})', 3)
    If @error Then Return SetError(1,0,'')
    If StringLen($aDate[2]) = 2 And $aDate[2] > StringRight(@YEAR, 2) Then
    $aDate[2] = '19' & $aDate[2]
    Else
    $aDate[2] = '20' & $aDate[2]
    EndIf
    $iDay = $aDate[0]
    $iMon = $aDate[1]
    $iYear = $aDate[2]
    EndIf
    If StringInStr($_vDateYear, '/') Then
    $aDate = StringRegExp($_vDateYear, '(\d{4})/(\d{1,2})/(\d{1,2})', 3)
    If @error Then Return SetError(1,0,'')
    $iDay = $aDate[2]
    $iMon = $aDate[1]
    $iYear = $aDate[0]
    EndIf
    EndIf
    EndIf
    If $_iLong <> 0 Then $_iLong = 1
    Local $tSYSTEMTIME = DllStructCreate("struct; word Year;word Month;word Dow;word Day;word Hour;word Minute;word Second;word MSeconds; endstruct")
    DllStructSetData($tSYSTEMTIME, 'Year', $iYear)
    DllStructSetData($tSYSTEMTIME, 'Month', $iMon)
    DllStructSetData($tSYSTEMTIME, 'Day', $iDay)
    Local $tFormat = DllStructCreate('wchar[64];'), $tDateStr = DllStructCreate('wchar[64];')
    DllStructSetData($tFormat, 1, "ddd','dddd")
    Local $ret = DllCall("kernel32", "long", "GetDateFormatW", "long", 0, "long", 0, _
    "ptr", DllStructGetPtr($tSYSTEMTIME), "ptr", DllStructGetPtr($tFormat), "ptr", DllStructGetPtr($tDateStr), "long", 64)
    Local $sDayName = DllStructGetData($tDateStr, 1)
    If $sDayName = '' Then Return SetError(2,0,'')
    Local $aDayName = StringSplit($sDayName, ',', 2)
    Return $aDayName[$_iLong]
    EndFunc ;==>_DateToDayNameLocale

    [/autoit]


    Um nur den deutschen Wochentag auszugeben, reicht natürlich auch diese Variante

    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    Func _DateToDayName($_iYear, $_iMonth, $_iDay)
    Local $aDayName[8] = [7,'Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag','Sonntag']
    Local $iDayName = _DateToDayOfWeekISO($_iYear, $_iMonth, $_iDay)
    If @error Then Return SetError(1,0,'')
    Return $aDayName[$iDayName]
    EndFunc

    [/autoit]
  • Hi,
    ich bin durchaus in der Lage, das von mir bevorzugte Datumsformat allein dem Skript hinzuzufügen ;)
    Doch ich meine, daß es grundsätzlich fehlt und du es deshalb mit einbauen solltest:
    Meine Foto- , MP3-, o.ä-Ordner sind vielfach nach dem Format
    jjjjmmtt (oder in englisch yyyymmdd)
    aufgebaut, denn das erleichtert die Sortierung nach Alter ungemein..
    (natürlich auch die Suche^^)
    Das ist keine Nörgelei, nimm es einfach als Lob dafür, daß du dir die Arbeit gemacht hast :thumbup:
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..