- Offizieller Beitrag
Hi, nach langer Zeit mal wieder was von mir.
Hintergrund:
Ich arbeite in einer Firma, die u. a. Medizin. Software vertreibt. Diese stammt aus den USA und ist dadurch sowohl in eglischen als auch deutsche Versionen am Markt.
Ich hab nun ein kleines Prog geschrieben um Inhaltsverzeichnisse von Datensicherungen zu erstellen mit Auflistung Patient und Meßdatum.
Dabei ist mir erstmals aufgefallen, dass es an deutschen und amerikanischen Datumsformaten zusammen 20 ! Variationen gibt. Um hier mit meinem Prog unabhängig zu sein brauchte ich also eine Konvertierungsfunktion. Vielleicht ist sie ja auch jemand anderem von Nutzen.
;===============================================================================
;
; Function Name: _MultiDateToNorm()
;
; Description: Konvertiert folgende Datumsformate:
; (T)T.(M)M.(JJ)JJ (deutsch)
; (M)M/(T)T/(JJ)JJ (amerikanisch)
; (T)T-Mon-(JJ)JJ (amerikanisch, lang)
;
; Syntax: _MultiDateToNorm($date,[$s_sort])
;
; Parameter: $date - zu konvertierendes Datum in einem der angeführten Formate
; optional:
; $s_sort - Vorgabe = 0 (inaktiv); 1 für Ausgabe sortierbarer String
;
; Return Value: (TT.MM.JJJJ); optional (JJJJ-MM-TT)
;
; Author: BugFix (bug_fix@web.de)
;
;===============================================================================
Func _MultiDateToNorm($date,$s_sort = 0)
If StringMid($date,2,1) = "." Then ; Tag dt. einstellig ?
$date = "0" & $date ; Vornull Tag
EndIf
If StringMid($date,2,1) = "/" Then ; Monat amerik. einstellig ?
$date = "0" & $date ; Vornull Monat
EndIf
If StringMid($date,2,1) = "-" Then ; Tag amerik. lang einstellig ?
$date = "0" & $date ; Vornull Tag
EndIf
If StringMid($date,5,1) = "." Then ; Monat dt. einstellig ?
$tmp = StringTrimLeft($date,3)
$date = StringLeft($date,3) & "0" & $tmp ; Vornull Monat
EndIf
If StringMid($date,5,1) = "/" Then ; Tag amerik. einstellig ?
$tmp = StringTrimLeft($date,3)
$date = StringLeft($date,3) & "0" & $tmp ; Vornull Tag
EndIf
If StringLen($date) = 8 Or StringLen($date) = 9 Then ; Jahr 2-stellig ?
$strJJ = StringRight($date,2) ; Zeichen für Jahr selektieren
$date = StringTrimRight($date,2) ; beide Zeichen für Jahr abschneiden
If $strJJ < 30 Then
$strJH = "20" ; 00 bis 29 sind 20..
Else
$strJH = "19" ; 30 bis 99 sind 19..
EndIf
$date = $date & $strJH & $strJJ ; Jahr jetzt 4-stellig
EndIf
Select
Case StringMid($date,3,1) = "/" ; amerik. Format "MM/TT/JJJJ" ?
$strMM = StringLeft($date,2)
$strTT = StringMid($date, 4,2)
$date = $strTT & "." & $strMM & "." & StringRight($date,4)
Case StringMid($date,3,1) = "-" ;amerik. Format "TT-Mon-JJJJ" ?
$strTT = StringLeft($date,2)
$strMM = StringUpper(stringmid($date,4,3))
Select
Case $strMM = "JAN"
$strMM = "01"
Case $strMM = "FEB"
$strMM = "02"
Case $strMM = "MAR"
$strMM = "03"
Case $strMM = "APR"
$strMM = "04"
Case $strMM = "MAY"
$strMM = "05"
Case $strMM = "JUN"
$strMM = "06"
Case $strMM = "JUL"
$strMM = "07"
Case $strMM = "AUG"
$strMM = "08"
Case $strMM = "SEP"
$strMM = "09"
Case $strMM = "OCT"
$strMM = "10"
Case $strMM = "NOV"
$strMM = "11"
Case $strMM = "DEC"
$strMM = "12"
EndSelect
$date = $strTT & "." & $strMM & "." & StringRight($date,4)
EndSelect
If $s_sort = 1 Then ; Optionsschalter gesetzt ?
$date = StringRight($date,4) & "-" & StringMid($date,4,2) & "-" & StringMid($date,1,2) ; als sortierbarer String
EndIf
Return $date
EndFunc ;==>_MultiDateToNorm()
Alles anzeigen
Edit:
Ich hab die Funktion noch etwas erweitert. Enthalten ist jetzt ein optionaler Schalter um die Ausgabe als sortierbarer String (JJJJ-MM-TT) zu erreichen. In ListView-Feldern kann man Datumsangaben nur so vernüftig sortieren.
Abgeändert habe ich auch die Zuordnung des Jahrhunderts zur Jahreszahl. Die war bisher speziell für mein Programm konfiguriert - jetzt hab ich sie wie in Windows üblich verwendet (..30 bis ..99 = 19.. / ..00 bis ..29 = 20.. ).
Wer es nur mal probieren möchte - im Code habe ich jetzt eine GUI zum Testen vorangestellt.