- 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
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)
#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
;===============================================================================
; 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
... 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
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)
#cs - Output
Samstag
Sa
Samstag
Donnerstag
Samstag
Sa
So
Do
Fr
Samstag
>< @error: 2
#ce
;===============================================================================
; 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
Um nur den deutschen Wochentag auszugeben, reicht natürlich auch diese Variante
Spoiler anzeigen
#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