This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
vba:cast:strtodate [05.08.2015 15:38:08] yaslaw |
vba:cast:strtodate [28.04.2017 09:33:17] (current) yaslaw |
||
---|---|---|---|
Line 1: | Line 1: | ||
<const> | <const> | ||
- | version=2.2.0 | + | version=2.5.0 |
- | vdate=05.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 54: | 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 71: | 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 Format. Es 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 95: | 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 114: | 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. |