#Region - TimeStamp ; 2012-12-29 18:59:27 v 1.0 #EndRegion - TimeStamp ;=============================================================================== ; Script Name......: DateEx.au3 ; Description......: Erweiterte Datumsfunktionen ; .................: _DateGetFormatted() ; .................: _DateToDayNameLocale ; AutoIt version...: 3.3.8.0 ; Author(s)........: BugFix ( bugfix@autoit.de ) ;=============================================================================== ;=============================================================================== ; 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 ( bugfix@autoit.de ) ;=============================================================================== 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] ElseIf 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[1] 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 ;=============================================================================== ; 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 ( bugfix@autoit.de ) ;=============================================================================== 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