User Tools

Site Tools


vba:cast:strtodate

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
vba:cast:strtodate [29.04.2015 11:22:35]
yaslaw
vba:cast:strtodate [28.04.2017 09:33:17] (current)
yaslaw
Line 1: Line 1:
 <​const>​ <​const>​
-    version=2.1.0 +    version=2.5.0 
-    vdate=16.04.2015+    vdate=15.03.2016
     fname=cast_strtodate.bas     fname=cast_strtodate.bas
     ns=%NAMESPACE%     ns=%NAMESPACE%
Line 16: Line 16:
 generierten Pattern in ein privates Dictionary-Objekt gespeichert. Das führt zu einer erheblichen ​ generierten Pattern in ein privates Dictionary-Objekt gespeichert. Das führt zu einer erheblichen ​
 Geschwindigkeitsverbesserung bei der Anwendung innerhalb eines SQL-Statements Geschwindigkeitsverbesserung bei der Anwendung innerhalb eines SQL-Statements
 +
 +> siehe auch [[vba:​classes:​date:​datetime:​index]]
 ===== Definition ===== ===== Definition =====
-<​code>​date = strToDate(string [,format [,​parameters]])</​code>​+<​code>​date = strToDate(string [,format [,​parameters ​[,erster Tag der Woche [,erste Woche des Jahres [,​nanosekunden]]]]])</​code>​
 <code vb>​Public Function strToDate( _ <code vb>​Public Function strToDate( _
-        ByVal iDateS ​As String, _+        ByVal iDate As Variant, _
         Optional ByVal iFormat As String = vbNullString,​ _         Optional ByVal iFormat As String = vbNullString,​ _
-        Optional ByVal iParams As tdtParams = tdtIgnoreCase _ +        Optional ByVal iParams As tdtParams = tdtIgnoreCase, _ 
-) As Date</​code>​+        Optional ByVal iFirstDayOfWeek As VbDayOfWeek = vbUseSystemDayOfWeek,​ _ 
 +        Optional ByVal iFirstWeekOfYear As VbFirstWeekOfYear = vbUseSystem,​ _ 
 +        Optional ByRef oNanoSecounds As Long 
 +) As Variant</​code>​
  
 ==== Parameterliste ==== ==== Parameterliste ====
Line 28: Line 33:
   ***//​iFormat//​** Das Datumsformat. Wird eines der folgenden Zeichen als Trennzeichen verwendet, muss es mit einem \ maskiert werden (siehe Beispiele): M D Y H N S    ***//​iFormat//​** Das Datumsformat. Wird eines der folgenden Zeichen als Trennzeichen verwendet, muss es mit einem \ maskiert werden (siehe Beispiele): M D Y H N S 
   ***//​iParams//​** Weitere Parameter. Siehe dazu der Enumerator [[#​tdtParams]]. DIese sind mit + kombinierbar. Default ist %%tdtIgnoreCase%%   ***//​iParams//​** Weitere Parameter. Siehe dazu der Enumerator [[#​tdtParams]]. DIese sind mit + kombinierbar. Default ist %%tdtIgnoreCase%%
 +  ***//​iFirstDayOfWeek//​** Angabe zum ersten Wochentag. Schweiz -> Montag
 +  ***//​iFirstWeekOfYear//​** Angabe zum ersten Woche im Jahr
 +  ***//​oNanoSecounds//​** Rückgabewert für die Nanosekunden (Siehe Beispiel [[#​extraktion_von_nanosekunden|| Extraktion von Nanosekunden]])
  
 ==== Enumerators ==== ==== Enumerators ====
Line 35: Line 43:
     tdtIgnoreCase = 2 ^ 0   '​Gross-Kleinschreibung bei Trennzeichen ignorieren     tdtIgnoreCase = 2 ^ 0   '​Gross-Kleinschreibung bei Trennzeichen ignorieren
     tdtExtractDate = 2 ^ 1  'Der String beimnhaltet vor oder nach dem Datum noch andere Werte. Das Datum wird extrahiert     tdtExtractDate = 2 ^ 1  'Der String beimnhaltet vor oder nach dem Datum noch andere Werte. Das Datum wird extrahiert
 +    tdtIgnoreError = 2 ^ 2  '​Fehler werden ignoriert. Im Fehlerfall wird NULL zurückgegeben
 +    tdtFomat2 = 2 ^ 3       '​Es handelt sich um ein Format im Stil von {$DD}.{$MM}
 End Enum</​code>​ End Enum</​code>​
  
Line 45: Line 55:
 | yy  | zweistelliges oder vierstelliges Jahr | | yy  | zweistelliges oder vierstelliges Jahr |
 | yyyy  | vierstelliges Jahr | | yyyy  | vierstelliges Jahr |
 +| q | QuartalAnfang (1.1.x - 1.10.x) |
 +| qq | QuartalEnde ​  ​(31.3.x - 31.12.x)|
 | h | Stunden ohne führende Null(0-24) | | h | Stunden ohne führende Null(0-24) |
 | hh  | Stunden mit führende Null(00-24) | | hh  | Stunden mit führende Null(00-24) |
Line 53: Line 65:
 | am/pm | Erwartet eine Angabe von AM oder PM | | am/pm | Erwartet eine Angabe von AM oder PM |
 | a/p | Erwartet eine Angabe von A oder P | | a/p | Erwartet eine Angabe von A oder P |
 +| y | Tag des Jahres |
 +| w | Tag der Woche |
 +| ww | Woche im Jahr |
 +| f | Nanosekunden |
 +| @ | Delemiter bei unklarer Trennung (siehe [[#​unklare_formate|Beispiel unklare Formate]]) |
  
 ==== Fehlerrückgabe ==== ==== Fehlerrückgabe ====
Line 70: Line 87:
 Hier einige Anwendungsbeispiele Hier einige Anwendungsbeispiele
 > Für die Ausgabe der Resultate verwendete ich die Funktion [[:​vba:​functions:​print_r:​]]. > Für die Ausgabe der Resultate verwendete ich die Funktion [[:​vba:​functions:​print_r:​]].
-<code vb>'​Ohne FormatEs wird intern cDate angewendet +=== Ohne Format ​=== 
-print_r strToDate("​5.9.2013"​) +Es wird intern cDate angewendet 
-<​Date>​ 05.09.2013+<code vb>print_r strToDate("​5.9.2013"​) 
 +<​Date>​ 05.09.2013</​code>​
  
-'Mit dem Format den Tag und Monat genau zuordnern. Damit aus 5.9 der 9te Mai wird+=== Mit Format === 
 +Diverse Formatierungen mit Formaten 
 +<code vb>'Mit dem Format den Tag und Monat genau zuordnern. Damit aus 5.9 der 9te Mai wird
 print_r strToDate("​5.9.2013",​ "​m.d.yyyy"​) print_r strToDate("​5.9.2013",​ "​m.d.yyyy"​)
 <​Date>​ 09.05.2013 <​Date>​ 09.05.2013
Line 94: Line 114:
 <​Date>​ 17:07:05 <​Date>​ 17:07:05
  
-'Mit Trennzeichen,​ die auch Formate sind. Darum müsse diese Zeichen im Format mit einem \ maskiert werden +'Quartalsanfang 
-'Das Format ist: D gefolgt vom Tag (1-31), M gefolgt von einem Monat (01-12) und Y gefolgt vom Jahr +print_r strToDate("​Q3 2015", "\QQ YYYY") 
-print_r strToDate("​D1M05Y2013", "\DD\MMM\YYYYY") +<​Date>​ 01.07.2015
-<​Date>​ 01.05.2013+
  
-'Ohne tdtExtractDate+'Und das Quartalsende 
 +print_r strToDate("​Q3 2015", "\QQQ YYYY"​) 
 +<​Date>​ 30.09.2015 
 +</​code>​ 
 + 
 +=== Länder Formatchaos === 
 +Ein Datum kann je nach Land unterschiedlich geschrieben werden. Dass kann zu Fehler führen. Nehmen wir das Amerikanische Format MM/DD/YYYY. In der Schweiz und in Deutschland haben wir DD.MM.YYYY. VBA nimmt die Ländereinstellung vom PC-Profil. Wenn der Tag kleiner oder gleich 12 ist, dann haben wir ein Problem. Dann erkennt VBA den Tag als Monat und das Resultat ist Falsch. 
 +\\ Als Beispiel der 5. Januar 2017. Im Amerikanischen Format 01/05/2017. cDate mit Schweizer Einstellung macht daraus den 1. Mai 2017. 
 +<code vb>'​Einfacher cDate. Der Tag ist Kleinergleich als 12. Das Resultat ist falsch 
 +print_r cDate("​01/​05/​2017"​) 
 +<​Date>​ 01.05.2017 
 + 
 +'Wenn die zweite Position über 12 ist, erkennt VBA, dass es sich um den Tag handeln muss 
 +print_r cDate("​01/​15/​2017"​) 
 +<​Date>​ 15.01.2017 
 + 
 + 
 +'Mit strToDate und einem definierten Format wird das Datum richtig umgesetzt 
 +print_r strToDate("​01/​05/​2017",​ "​MM/​DD/​YYYY"​) 
 +<​Date>​ 05.01.2017</​code>​ 
 + 
 +=== Unklare Formate === 
 +Mit Trennzeichen,​ die auch Formate sind. Darum müsse diese Zeichen im Format mit einem \ maskiert werden 
 +Das Format ist: D gefolgt vom Tag (1-31), M gefolgt von einem Monat (01-12) und Y gefolgt vom Jahr 
 +<code vb>​print_r strToDate("​D1M05Y2013",​ "​\DD\MMM\YYYYY"​) 
 +<​Date>​ 01.05.2013</​code>​ 
 + 
 +Ein Bespiel, bei dem nicht klar ist wo die Trennung ist. In Dem Fall der 133te Tag im Jahr 2015. 
 +<code vb>​print_r strToDate("​1332015",​ "​YYYYY"​) 
 +<​Date>​ 15.01.1332 
 +'Und jetzt mit einem @ als Delemiter um genau anzugeben wo der neue Pattern beginnt 
 +print_r strToDate("​1332015",​ "​Y@YYYY"​) 
 +<​Date>​ 13.05.2015</​code>​ 
 + 
 +=== Die Funktion der Paramters === 
 +<code vb>'Ohne tdtExtractDate
 print_r strToDate("​Heute ist der 1.12.2014",​ "​d.m.yyyy"​) print_r strToDate("​Heute ist der 1.12.2014",​ "​d.m.yyyy"​)
 -> Fehler -2147221502 -> Fehler -2147221502
Line 113: Line 167:
 'Und kombiniert mit tdtIgnoreCase 'Und kombiniert mit tdtIgnoreCase
 print_r strToDate("​Heute ist der 1te des 12ten Monats 2014", "dte \de\s mte\n \mo\nat\s yyyy", tdtExtractDate + tdtIgnoreCase) print_r strToDate("​Heute ist der 1te des 12ten Monats 2014", "dte \de\s mte\n \mo\nat\s yyyy", tdtExtractDate + tdtIgnoreCase)
-<​Date>​ 01.12.2014 +<​Date>​ 01.12.2014</​code>​ 
-</​code>​+ 
 +=== FirstDayOfWeek und FirstWeekOfYear === 
 +Bei Formaten mit Wochentage und Wochennummer ist es entscheidend,​ was als Erste Woche des Jahres gerechnet wird und mit welchem Tag die Woche beginnt. 
 +<code vb>'​Zweiter Wochentag in der 3ten Woche im Jahr 2015 nach Systemeinstellungen Schweiz 
 +print_r ​ strToDate("​2/​3/​2015",​ "​W/​WW/​YYYY"​) 
 +<​Date>​ 13.01.2015 
 + 
 +'​Dasselbe wenn die Erste Woche als die erste Volle Woche gerechnet wird 
 +print_r ​ strToDate("​2/​3/​2015",​ "​W/​WW/​YYYY",,,​vbFirstFullWeek) 
 +<​Date>​ 20.01.2015 
 + 
 +'Und dann noch di Ienstellung,​ dass der erste tag in der Woche der Sonntag ist (ja, das gibt es in gewissen Ländern) 
 +print_r ​ strToDate("​2/​3/​2015",​ "​W/​WW/​YYYY",,​vbSunday,​vbFirstFullWeek) 
 +<​Date>​ 19.01.2015</​code>​ 
 + 
 +=== Extraktion von Nanosekunden === 
 +Leider können die Nanosekunden nicht im Datumsformat ausgegeben werde. Das ist so von VBA nicht vorgesehen. Über den Rückgabeparameter oNanoSecounds kann trotzdem darauf zugegriffen werden 
 +<code vb>Dim nano As Long 
 +Dim dt As Date 
 +dt = strToDate("​12:​13:​34.01234",​ "​HH:​MM:​NN.F",​ , , , nano) 
 +print_r dt   -> <​Date>​ 31.12.2000 12:34:00 
 +print_r nano -> <​Long>​ 12340000</​code>​ 
 + 
 + 
 +=== Datumsstring umformatieren ===
 Noch ein kleines Beispiel zum umformatieren eines Datum-Strings in ein anderer. Noch ein kleines Beispiel zum umformatieren eines Datum-Strings in ein anderer.
 Das brauche ich häufig wenn ich mit Schnittstellen zu anderen System arbeite. Das brauche ich häufig wenn ich mit Schnittstellen zu anderen System arbeite.
vba/cast/strtodate.1430299355.txt.gz · Last modified: 29.04.2015 11:22:35 by yaslaw