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.09.2015 09:56:55]
yaslaw [Formatidentifikatoren]
vba:cast:strtodate [28.04.2017 09:33:17] (current)
yaslaw
Line 1: Line 1:
 <​const>​ <​const>​
-    version=2.3.1 +    version=2.5.0 
-    vdate=07.09.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 36: Line 44:
     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     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 46: 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 58: Line 69:
 | ww | Woche im Jahr | | ww | Woche im Jahr |
 | f | Nanosekunden | | f | Nanosekunden |
-| @ | Delemiter bei unklarer Trennung |+| @ | Delemiter bei unklarer Trennung ​(siehe [[#​unklare_formate|Beispiel unklare Formate]]) ​|
  
 ==== Fehlerrückgabe ==== ==== Fehlerrückgabe ====
Line 101: Line 112:
 'nur die Zeit 'nur die Zeit
 print_r strToDate("​17:​6:​65",​ "​h:​n:​s"​) print_r strToDate("​17:​6:​65",​ "​h:​n:​s"​)
-<​Date>​ 17:​07:​05</​code>​+<​Date>​ 17:07:05 
 + 
 +'​Quartalsanfang 
 +print_r strToDate("​Q3 2015", "\QQ YYYY"​) 
 +<​Date>​ 01.07.2015 
 + 
 +'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 === === Unklare Formate ===
Line 109: Line 145:
 <​Date>​ 01.05.2013</​code>​ <​Date>​ 01.05.2013</​code>​
  
-Ein Bespiel, bei dem nicht klar ist wo die Trennung ist+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"​) <code vb>​print_r strToDate("​1332015",​ "​YYYYY"​)
 <​Date>​ 15.01.1332 <​Date>​ 15.01.1332
Line 132: Line 168:
 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</​code>​ <​Date>​ 01.12.2014</​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 === === Extraktion von Nanosekunden ===
vba/cast/strtodate.1443513415.txt.gz · Last modified: 29.09.2015 09:56:55 by yaslaw