This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
vba:cast:strtodate [24.08.2015 09:34:21] yaslaw |
vba:cast:strtodate [28.04.2017 09:33:17] (current) yaslaw |
||
---|---|---|---|
Line 1: | Line 1: | ||
<const> | <const> | ||
- | version=2.3.0 | + | version=2.5.0 |
- | vdate=25.08.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 (siehe [[#unklare_formate|Beispiel unklare Formate]]) | | ||
==== Fehlerrückgabe ==== | ==== Fehlerrückgabe ==== | ||
Line 100: | 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 108: | 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 131: | 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 === |