{{keywords>vba,datetime}} version=1.10.0 vdate=04.07.2016 fname=datetime.cls ns=%NAMESPACE% fpath=/vba/classes/date ====== [VBA] DateTime ====== ==Version %%version%% %%vdate%%== Die Klasse DateTime beinhaltet alle Möglichen Funktionen rund um das Datum. Datumsrechnungen in VBA sind eine Kunst für sich. Viele Funktionen, die man aus anderen Sprachen kennt, fehlen gänzlich. Das endet damit, dass die meisten Datumsrechnungen irgendwie zusammengebastelt werden müssen. Darum habe ich in Anlehnung zu PHP die Klassen DateTime und DateInterval erstellt. Diese Seite befasst sich mit der Klasse DateTime. >//Die Klasse hat versteckte Attribute. Damit diese aktiv übernommen werden reicht es nicht aus, den Code in eine neue Klasse zu kopieren. Man muss die Klasse aus der Datei nach VBA importieren.// >{{popup>:vba:vba_importfile.png|Bild zum Import}} {{..%%fname%%|Download %%fname%% (V-%%version%%)}} Mit der Version 1.8.0 wurde das Verhalten des Paramters [[#Allgemein: Rückgabeparamter iByRef (Rückgabewert)]] verändert. Neu ist er Standardmässig auf True und nicht mehr auf False. Falls das nicht gewünscht ist, kann man die Konstante C_DEFAULT_BYREF auf False umstellen ===== Abhängigkeiten ===== Die Klasse [[vba:classes:date:dateinterval:index]] muss ebenfalls installiert sein: {{:vba:classes:date:dateinterval.cls|}} Die ganze Geschichte mit Zeitzonen ist noch nicht umgesetzt. Wird sicher lustig mit der Nordkoreanischen Halbstundenversetzung. Zusätzlich kann mit dem Interface [[vba:classes:iformattable]] gearbeitet werden. Über die Systemvariable ''IFormattable_exists'' kann das Interface dazugeschlatet werden. ===== Settings / Systemvariablen ===== Über 2 Systemvariablen kann der Code der Umgebung angepasst werden. ***IFormattable_exists** (Boolean) Mit dieser Variabel kann das Interface [[vba:classes:iformattable]] dazu geschaltet werden. ***isAccess** (Boolean) Falls der Code in Excel oder Word verwednet werden soll, muss diese Variabel auf False gesetzt werden, damit die Funktion NZ() dazugeschaltet wird ===== Definitionen ===== > Für die Ausgabe der Resultate verwendete ich die Funktion [[:vba:functions:print_r:|print_r() bzw. d()]]. ==== Creatoren ==== Es gibt verschiedene Möglichkeiten ein DateTime zu initialisieren ^ Methode ^ Rückgabetyp ^ Beschreibung ^ | [[#construct]] | %%DateTime%% | Initialisiert ein bestehendes Objekt neu | | [[#instance]] | %%DateTime%% | Erstellt eine neue Instance | | [[#serial]] | %%DateTime%% | Setzt Datum und Zeit. Entspricht %%DateSerial() + TimeSreial()%% | ==== Methoden ==== ^ Methode ^ Rückgabetyp ^ Beschreibung ^ | [[#add/minus | add]] | %%DateTime%% | Rechnet ein %%DateInterval%% zum Datum hinzu | | [[#addSingleValue]] | %%DateTime%% | Rechnet ein einzelnen Part hinzu | | [[#clone]] | %%DateTime%% | Erstellt eine Kopie des %%DateTime%% Objektes | | [[#diff]] | %%DateInterval%% | Gibt die Differenz als %%DateInterval%% zu einem Datum zurück | | [[#format]] | String | Gibt ein formatiertes Datum zurück -> VBA.format() | | [[#add/minus | minus]] | %%DateTime%% | Zählt ein %%DateInterval%% vom Datum ab | | [[#trunc]] | %%DateTime%% | Schneidet Den Hinteren Teil des Timestamps ab | | [[#round]] | %%DateTime%% | Rundet den Timestamp | | [[#modify]] | %%DateTime%% | Ändern eines speziellen Wertes | | [[#interval]] | Array | Erstellt eine Serie von Daten anhand eines Intervals | | [[#setProperty]] |%%DateTime%% | Setzt ein Property ung gibt ein DateTime zurück | | [[#toString]] | String | Gibt das Objekt als String zurück | ==== Properties ==== Ich unterscheide hier zwischen Properties und Attribute. Attribute haben direkt mit den Datum/Zeit zu tun, die Properties steuern das Verhalten der Klasse ^ Property ^ Rückgabetyp ^ Get/Set ^ Beschreibung ^ | returnType | %%dtReturnTypes%% | Get/Set | Bei gewissen Methoden kann man das Rückgabetype auswählen | | sqlDateFormatString | String | Get | SQL Formatstring | | toString | String | Get | Datum als String im sql/vba Format. Analog zum Attribut sqlTimeStamp. Wird im Interface IFormatter wieder verwendet | ==== Attribute ==== > Alle Attribute sind les- und schreibbar ^ Attribut ^ Rückgabetyp ^ Beschreibung ^ Format ^ | %%dateValue%% | Variant | Nur Datum | | | day | Integer | Tage | D oder DD ((1 bzw. 2 Stellige Zahl)) | | dayOfWeek | Integer | Tag in der Woche | W | | dayOfYear| Long | Tag im Jahr | Y | | firstDayOfWeek | VbDayOfWeek | Definition: Erste Woche im Jahr | | | firstWeekOfYear | VbFirstWeekOfYear | Definition: Erster Tag in der Woche | | | hour | Integer | Stunden | H oder HH ((1 bzw. 2 Stellige Zahl)) | | minute | Integer | Minuten | N oder NN ((1 bzw. 2 Stellige Zahl)) | | %%microSecond%% | Long | Mikrosekunden | | | %%milliSecond%% | Long | Millisekunden | | | month | Integer | Monat | M oder MM ((1 bzw. 2 Stellige Zahl)) | | %%nanoSecond%% | Variant | Nanosekunden | F | | %%patternDelemiter%% | String*1 | Optionales Trennzeichen bei unklaren Pattern für. Standard: @ | | | second | Integer | Sekunde | S oder SS ((1 bzw. 2 Stellige Zahl)) | | timestamp | Date | Ganzes Datum inkl. Zeit | | | %%timeValue%% | Variant | Nur Zeit | | | week | Long | Woche im Jahr | WW | | year | Integer | Jahr | YY oder YYYY ((2 bzw. 4 Stellige Zahl)) | 2016 | | %%sqlDate%% | String | Datum im SQL-Formtat | #MM/DD/YYYY# oder #YYYY-MM-DD# | | %%sqlTime%% | String | Zeit im SQL-Formtat | #HH:NN:SS# | | %%sqlTimestamp%% | String | Timestamp im SQL-Formtat | #MM/DD/YYYY HH:NN:SS# oder #YYYY-MM-DD HH:NN:SS# | Beispiel für die Werte print_r DateTime("2016-03-02 11:36:42.0123456", "YYYY-MM-DD HH:NN:SS.F") ( [timestamp] => 02.03.2016 11:36:42 [dateValue] => 02.03.2016 [timeValue] => 11:36:42 [year] => 2016 [month] => 3 [monthName] => 'März' [day] => 2 [hour] => 11 [minute] => 36 [second] => 42 [nanoSecond] => 12345600 [microSecond] => 12346 [milliSecond] => 12 [firstWeekOfYear] => 0 [firstDayOfWeek] => 0 [patternDelemiter] => '@' [dayOfWeek] => 3 [quarter] => 1 [week] => 9 [dayOfWeekName] => 'Mittwoch' [dayOfYear] => 62 [sqlTimeStamp] => '#2016-03-02 11:36:42#' [sqlDate] => '#2016-03-02#' [sqlTime] => '#11:36:42#' [sqlFormat] => 16 [returnType] => 0 [sqlDateFormatString] => 'YYYY-MM-DD' ) ) ==== Enumeratoren ==== Es gibt verscheidene öffentliche Enumeratoren. === dtParams === dtParams steuert das Verhalten der Klasse. Die verschiedenen Paramter sind komulierbar, wobei nicht alle Kombinationen Sinn ergeben Public Enum dtParams dtNone = 0 'Parameters zur Behandlung des InputStrings dtInFormatIgnoreCase = 2 ^ 0 'Gross-Kleinschreibung bei Trennzeichen ignorieren dtInFormatFormat2 = 2 ^ 1 'Beim Übergabewert iFormat handelt sich um ein Format im Stil von {$DD}.{$MM} 'Paramter zur SQL-Ausgabe dtOutSqlFormatUs = 2 ^ 5 'SQL Format US dtOutSqlFormatIso8601 = 2 ^ 6 'SQL Format EU (ISO8601) dtOutSqlFormatManual = 2 ^ 7 'Das Format wird vom User vorgegeben (muss über SqlDateFormatString oder über setParameter(dtpSqlDateFormatString, ...) gesetzt werden) End Enum === dtSqlFormats === Paramter um das SQL-Format zu setzen. Es sind alle auch in dtParams vorhanden. Public Enum dtSqlFormats dtsqlus = dtOutSqlFormatUs 'US: #MM/DD/YYYY# dtSqlIso8601 = dtOutSqlFormatIso8601 'EU, ISO-Norm: #YYYY-MM-DD# https://de.wikipedia.org/wiki/ISO_8601 dtSqlManual = dtOutSqlFormatManual 'User Spezialformat dtSqlDefault = dtsqlus 'Standard definieren End Enum === dtReturnTypes === Bei gewissen Methoden kann man das Rückgabetype auswählen Public Enum dtReturnTypes dtDateTime = 2 ^ 15 'dtOutDateTime dtTimestamp = 2 ^ 16 'dtOutTimestamp dtRetDefault = dtDateTime End Enum === dtErrorNumbers === Mögliche Errors. Normalerweise programmiere ich dazu Public Const. Das geht aber in eine Class nicht. Public Enum dtErrorNumbers dtErrInvalidFormat = vbObjectError + 1 'Der String passt nicht mit dem Format überein dtErrNotParseble = vbObjectError + 2 'Das Format ist nicht parsbar End Enum === dtProperties === Attribute, die gesetzt werden können. Wird für [[#setProperty]] genutzt Public Enum dtProperties dtpTimestamp dtpDateValue dtpTimeValue dtpYear dtpMonth dtpDay dtpHour dtpMinute dtpSecond dtpNanoSecond dtpMicroSecond dtpMilliSecond dtpFirstWeekOfYear dtpFirstDayOfWeek dtpPatternDelemiter dtpDayOfWeek dtpQuarter dtpWeek dtpDayOfYear dtpSqlTimeStamp dtpSqlDate dtpSqlTime dtpSqlFormat dtpReturnType dtpSqlDateFormatString End Enum ===== Creatoren ===== ==== Verschiedene Initialwerte für construct() und instance() ==== Hier die verschiedenen Arten, wie ein DateTime initialisert werden kann. Ich setze hier immer die Werte direkt ein. Natürlich funktioniert das auch alles aus Variablen hinaus. === Aktueller Timestamp === Die folgenden Beispiele initialisieren ein DateTime mit dem Aktuellen Timestamp d DateTime().timestamp 30.03.2016 15:10:51 d DateTime(now).timestamp 30.03.2016 15:11:00 d DateTime(Null).timestamp 30.03.2016 15:11:12 d DateTime("").timestamp 30.03.2016 15:11:25 === Fixer TimeStamp === Es können verschiedene Date oder Time übergeben werden. Natürlich auch aus Date-Variablen d DateTime(#2016-03-15 12:00:00#).timestamp 15.03.2016 12:00:00 d DateTime(#2016-03-15#).timestamp 15.03.2016 d DateTime(#12:00:00#).timestamp 12:00:00 Und dasselbe mit Datumsstring. Es funktionieren auch Formatiert Strings analog zu [[vba:cast:strtodate]] d DateTime("2016-02-18").timestamp 18.02.2016 d DateTime("20160218", "YYYYMMDD").timestamp 18.02.2016 d DateTime("20160218", "{$YYYY}{$MM}{$DD}", dtInFormatFormat2).timestamp 18.02.2016 Auch DateTime Objekte können übergeben werden. d DateTime(DateTime()).timestamp 30.03.2016 15:19:13 === Interval als Startparameter === Auch ein [[vba:classes:date:dateinterval:index]] kann übergeben werden. Entweder nur der IntervalString oder ein ganzes Objekt. Der Interval wird autumatisch zum aktuellen Timestamp hinzugerechnet. Also: Jetzt + Interval d DateTime("P3D").dateValue 02.04.2016 d DateTime(DateInterval("P3D")).dateValue 02.04.2016 d DateTime("-P3D").dateValue 27.03.2016 ==== construct() ==== Set obj2 = obj1.construct([timestamp][, format[, FormatParams[, FirstDayOfWeek[, FirstWeekOfYear]]]]) Setzt die Werte in ein bestehndes DateTime Objekt und gibt eine Referenz auf sich selber zurück. > Für die Variante mit einem Datumsstring siehe auch [[vba:cast:strtodate]] '/** ' * Initialisiert das Objekt ' * @param Date/String/DateTime Timestamp. Ein Datum, ein Datumsstring oder ein DateTime Objekt. Standart ist Now() ' * @param String Wenn der TimeStampein String ist, kann hier das Format mitgegeben werden. Siehe auch http://wiki.yaslaw.info/dokuwiki/doku.php/vba/cast/strtodate ' * @param dtDtringParams Weitere Parameters zum Stringformat ' * @param vbDayOfWeek Erster Tag der Woche ' * @param vbFirstWeekOfYear Definition der ersten Kalenderwoche im Kalender ' * @return DateTime ' */ Public Function construct( _ Optional ByRef iTimestamp As Variant = Null, _ Optional ByVal iFormat As String = Empty, _ Optional ByVal iFormatParams As dtStringParams = dtStringNone, _ Optional ByVal iFirstDayOfWeek As VbDayOfWeek = vbUseSystemDayOfWeek, _ Optional ByVal iFirstWeekOfYear As VbFirstWeekOfYear = vbUseSystem _ ) As DateTime == Beispiel == Dim dt1 As New DateTime Dim dt2 As DateTime Set dt2 = dt1.construct(#1/1/2015#) 'dt1 auf den ersten Januar setzen und als Referenz auf dt2 verknüpfen Debug.Print dt1.timestamp ' -> 01.01.2015 Debug.Print dt2.timestamp ' -> 01.01.2015 dt2.construct "15072015", "DDMMYYYY" 'in der Referenz das Datum auf den 15.Juli setzen 'anschlissend das referenzierte Objekt abfragen Debug.Print dt1.timestamp ' -> 15.07.2015 ==== instance() ==== Set obj = DateTime([timestamp][, format[, FormatParams[, FirstDayOfWeek[, FirstWeekOfYear]]]]) Instanciert ein DateTime Objekt. Da diese Methode das versteckte Attribut instance.VB_UserMemId gesetzt hat, ist es die Standartfunktion für die DateTime Instanzierung. Diese Methode eignet sich sehr gut, wenn man nur mal eben was rechnen muss, das Objekt aber nachher nicht mehr braucht. > Für die Variante mit einem Datumsstring siehe auch [[vba:cast:strtodate]] '/** ' * Erstellt eine neue Insatance ' * Besitzt das Attribute instance.VB_UserMemId = 0. Darum ist dies die Standardfunktion für DateTime() ' * @param Date/String/DateTime Timestamp. Ein Datum, ein Datumsstring oder ein DateTime Objekt. Standart ist Now() ' * @param String Wenn der TimeStampein String ist, kann hier das Format mitgegeben werden. Siehe auch http://wiki.yaslaw.info/dokuwiki/doku.php/vba/cast/strtodate ' * @param dtDtringParams Weitere Parameters zum Stringformat ' * @param vbDayOfWeek Erster Tag der Woche ' * @param vbFirstWeekOfYear Definition der ersten Kalenderwoche im Kalender ' * @return DateTime ' */ Public Function instance( _ Optional ByRef iTimestamp As Variant = Null, _ Optional ByVal iFormat As String = Empty, _ Optional ByVal iFormatParams As dtStringParams = dtStringNone, _ Optional ByVal iFirstDayOfWeek As VbDayOfWeek = vbUseSystemDayOfWeek, _ Optional ByVal iFirstWeekOfYear As VbFirstWeekOfYear = vbUseSystem _ ) As DateTimee == Beispiele == 'Einfache instanzierung eines Objektes Dim dt1 As Datim Set dt1 = DateTime(#1/1/2015#) 'Einfache Verwendung: Differenz in Tagen vom 1ten Januar bis heute Dim diffInDays As Long diffInDays = DateTime(#1/1/2015#).diff(Now).days d DateTime(#1-1-2015#).timestamp 01.01.2015 d DateTime("Der Timestamp ist: 02032015", "DDMMYYYY" ,dtStringExtractDate).timestamp 02.03.2015 ==== serial() ==== Set dt1 = DateTime.serial([Jahr [,Monat [,Tag [,Stunden [,Minuten [,Sekunden [,Nanosekunden [,Rückgabeart]]]]]]]]) '/** ' * Setzt Datum und Zeit. Entspricht DateSerial() + TimeSreial() + Nanosekunden ' * @param ... Die einzelnen Teile ' * @param Booelan Angabe ob der Rückgabewert eine neue Instanz oder eine Referenz sein soll ' * @param vbDayOfWeek Erster Tag der Woche ' * @param vbFirstWeekOfYear Definition der ersten Kalenderwoche im Kalender ' * @return DateTime ' */ Public Function serial( _ Optional ByVal iYear As Variant = Null, _ Optional ByVal iMonth As Integer = 1, _ Optional ByVal iDay As Integer = 1, _ Optional ByVal iHour As Integer = 0, _ Optional ByVal iMinute As Integer = 0, _ Optional ByVal iSecond As Integer = 0, _ Optional ByVal iNanoSecond As Variant = 0, _ Optional ByVal iByRef As Boolean = False, _ Optional ByVal iFirstDayOfWeek As VbDayOfWeek = vbUseSystemDayOfWeek, _ Optional ByVal iFirstWeekOfYear As VbFirstWeekOfYear = vbUseSystem _ ) As DateTime == Beispiel == d DateTime.serial(2015, 1, 1, 12, 30, 0, 200015056) ( [timestamp] => 01.01.2015 12:30:00 [dateValue] => 01.01.2015 [timeValue] => 12:30:00 [year] => 2015 [month] => 1 [day] => 1 [hour] => 12 [minute] => 30 [second] => 0 [nanoSecond] => 200015056 [microSecond] => 200015 [milliSecond] => 200 ) ===== Methoden auf einer Instance ===== === Allgemein: Rückgabeparamter iByRef (Rückgabewert) === Die meisten Methoden besitzen den Paramter iByRef (Boolean). Dieser sagt aus, ob das Objekt selber verändert und zurückgegeben wird oder ob das Resultat eine neue DateTime-Instanz ist * FALSE (Default)((Seit Version 1.8.0 nicht mehr)): Der Rückgabewert ist ein Clone an dem die Veränderung vorgenommen wurde. * TRUE (Default): Das Objekt selber wird verändert und eine Referenz wird zurückgegeben. == Beispiel == Dim dt1 As DateTime Dim dt2 As DateTime 'Das Objekt selber verändern Set dt1 = DateTime(#6/1/2015#) dt1.add "P1M" print_r dt1.dateValue '-> 01.07.2015 'Die Veränderung nur als neues Objekt zurückgeben Set dt1 = DateTime(#6/1/2015#) Set dt2 = dt1.minus("P1M", False) print_r dt1.dateValue '-> 01.06.2015 print_r dt2.dateValue '-> 01.05.2015 'Das Objekt selber verändern und gleichzeitig eine Referenz zurückgeben Set dt1 = DateTime(#6/1/2015#) Set dt2 = dt1.minus("P1M") print_r dt1.dateValue '-> 01.05.2015 print_r dt2.dateValue '-> 01.05.2015 'Wenn dt2 ist eine Referenz auf dt1. Wenn wir jetzt dt2 ändern, ändert sich auch dt1 dt2.add ("P2M") print_r dt1.dateValue '-> 01.07.2015 print_r dt2.dateValue '-> 01.07.2015 === Allgemein: Verkettung der Methoden === Die meisten Methoden geben wieder einen DateTime zurück. Normalerweise eine Referenz auf den bestehenden. Siehe dazu [[#Allgemein: Rückgabeparamter iByRef (Rückgabewert)]]. Dadurch kann man die Methoden miteinander Verketten. Da [[vba:classes:date:dateinterval:index]] das auch anbietet, kann amn diese 2 dabei schön kombinieren. Zum Beispiel: Erster Tag der aktuellen Woche + 4 Wochen und dazu die Differenz zu jetzt in Tagen d DateTime().trunc("WW").add("P4W").diff().days 26 'Jetzt. Dann den Monat auf den Juli überschreiben, den Tag auf den 3ten. Dann auf den Letzten Tag der Woche gehen und diesen Formatiert ausgeben d DateTime().modify("M", 6).modify("D", 3).getLastDayOfWeek.format("D MMMM YYYY") '5 Juni 2016' Und dasselbe. Jedoch eine Monat weniger, dafür mehr Tage als der Mai hat.. d DateTime().modify("M", 5).modify("D", 34).getLastDayOfWeek.format("D MMMM YYYY") '5 Juni 2016' ==== add()/minus() ==== Set dt2 = dt1.add(DateInterval [,Rückgabeart]) Set dt2 = dt1.minus(DateInterval [,Rückgabeart]) Rechnet ein Dateinterval zum Datum hinzu. Das Datumsintervall kann entwder vom Typ [[vba:classes:date:dateinterval:index]] sein oder ein Dateinterval String (ISO8601 Duration Definition((http://en.wikipedia.org/wiki/Iso8601#Durations))). Ebenso kann es eine Anzahl Tage sein. Will man eine andere Grösse einfach verändern, dann empfiehlt sich die Methode [[#addSingleValue]] '/** ' * Rechnet ein DateInterval zum Datum hinzu und gibt ein neues DateTime zurück. ' * @param DateInterval/IntervalSpec/Days ' * @param Boolean true: Das DateTimeObjekt wird selber nicht verändert - False: Das Objekt selber wird verändert ' * @return DateTime ' */ Public Function add( _ ByRef iInterval As Variant, _ Optional ByVal iByRef As Boolean = False _ ) As DateTime == Beispiel == '1 Monat, 3 Tage und 12 Stunden zum 1ten Januar hinzuzählen d DateTime(#1-1-2015#).add("P1M3DT12H").timestamp 04.02.2015 12:00:00 ==== addSingleValue() ==== Set dt2 = dt1.addSingleValue(interval, number [,Rückgabeart]) Im Gegensatz zu [[#add/minus]] wird hier nur ein einzelner Wert verändert. So wie man es von dateAdd() im VB kennt. '/** ' * Rechnet ein einzelnen Part hinzu ' * @param String Interval-String gem. DateAdd(). Y, M, D, H, N, S, F ' * @param Variant Wert ' * @param Boolean true: Das DateTimeObjekt wird selber nicht verändert - False: Das Objekt selber wird verändert ' * @return DateTime ' */ Public Function addSingleValue( _ ByVal iInterval As String, _ ByVal iNumber As Variant, _ Optional ByVal iByRef As Boolean = False _ ) As DateTime == Beispiel == '2 Monate vom ersten Januar abziehen d DateTime(#1-1-2015#).addSingleValue("M", -3).timestamp 01.10.2014 ==== clone() ==== Set dt2 = dt1.clone Erstellt ein Klon eines DateTime Objektes. Wenn man den Klon verändert, ändert das nichts an dem Basisobjekt '/** ' * Klont das Objekt ' * @return DateTime ' */ Public Function clone() As DateTime ==== diff() ==== Set di = dt.diff([timestamp, absolute]]) Erstellt ein [[vba:classes:date:dateinterval:index]] aufgrunde einem weiteren Timestamp '/** ' * Gibt die Differenz als DateInterval zu einem Datum zurück ' * @param Date/String/DateTime ' * @param Boolean ' * @return DateInterval ' */ Public Function diff( _ Optional ByRef iTimestamp As Variant = Null, _ Optional ByVal iAbsolute As Boolean = False _ ) As DateInterval Set diff = DateInterval.instanceFromDateDiff(pTimeStamp, iTimestamp, iAbsolute) End Function == Beispiel == 'Differnez von heute bis ende letzes Jahr. Ausgabe nach ISO8601 Duration Definition d DateTime(#12-31-2014#).diff(now).intervalSpec '-P7M19DT10H28M11S' d DateTime(#12-31-2014#).diff(now, true).intervalSpec 'P7M19DT10H28M24S' ==== format() ==== dateString = dt1.format(format [,FirstDayOfWeek [,FirstWeekOfYear]]) Wendet [[https://msdn.microsoft.com/en-us/library/office/gg251755.aspx|VBA.Format]] auf das DateTime Objekt an. Micro-/Milli-/Nanosekunden können mit F mitgegeben werden. Nanosekunden sind eigentlich 9 Stellen. Für die Ausgabe der Nanosekunden einfach 9 F schreiben, Für Milli 6 etc. '/** ' * Gibt ein formatiertes Datum zurück -> VBA.format() ' * Pattern gemäss VBA-format plus Nanosekunden (F). Die Anzahl F gibt die Nachkommastellen der Sekunden an. ' * @param String Format ' * @param vbDayOfWeek Erster Tag der Woche ' * @param vbFirstWeekOfYear Definition der ersten Kalenderwoche im Kalender ' */ Public Function format( _ ByVal iFormat As String, _ Optional ByVal iFirstDayOfWeek As VbDayOfWeek = -1, _ Optional ByVal iFirstWeekOfYear As VbFirstWeekOfYear = -1 _ ) As String == Beispiel == d DateTime().format("DDDD, D. MMMM YYYY") 'Montag, 5. Oktober 2015' 'Nanosekunden d DateTime("12:32:54.000001342").format("S.FFFFFFFFF") '54.000001342' 'Millisekunden d DateTime("12:32:54.000000742").format("S.FFFFFF") '54.000001' ==== format2() ==== dateString = dt1.format2(format [,FirstDayOfWeek [,FirstWeekOfYear]]) Formatiert ein DateTime zu einem String. Im Gegensatz zu format() werden die Formate als Pattern mitgegeben. Dadurch lassen sich Texte einfach parsen. Jedes Pattern, das formatiert werden soll muss in {$..} geschrieben werden. Siehe dazu die Beispiele. '/** ' * Gibt ein formatiertes Datum zurück. Im gegensatz zu format() müssend ie Pattern in {$...} geschtrieben werden ' * @param String Format ' * @param vbDayOfWeek Erster Tag der Woche ' * @param vbFirstWeekOfYear Definition der ersten Kalenderwoche im Kalender ' */ Public Function format2( _ ByVal iFormat As String, _ Optional ByVal iFirstDayOfWeek As VbDayOfWeek = -1, _ Optional ByVal iFirstWeekOfYear As VbFirstWeekOfYear = -1 _ ) As String == Beispiel == d DateTime().format2("Heute ist der {$dd.mm.yyyy}") 'Heute ist der 05.01.2016' d DateTime().format2("Heute ist der {$y} in der {$w} des Jahres {$yyyy}") 'Heute ist der 5 in der 2 des Jahres 2016' d DateTime("00:02:45.003754").format2("{$n} Minuten, {$s} Sekunden und {$fff} Milisekunden") '2 Minuten, 45 Sekunden und 004 Milisekunden' d DateTime(#13-05-2016#).format2("Heute ist der {$dd.mm.yyyy}. Es ist der {$w}te Tag in der {$ww}ten Kalenderwoche") 'Heute ist der 13.05.2016. Es ist der 5te Tag in der 19ten Kalenderwoche' ==== trunc() ==== Set dt2 = dt1.trunc([interval [,Rückgabeart]]) Kürzt ein DateTime auf einen bestimmten Teil. So ähnlich wie der int() Befehl '/** ' * Schneidet Den Hinteren Teil des Timestamps ab ' * @example DateTime(#2014-04-05 13:34:14#).trunc("H") --> 05.04.2014 13:00:00 ' DateTime(#2014-04-05 13:34:14#).trunc("M") --> 01.04.2014 00:00:00 ' * @param String Interval-String gem. DateAdd(). YYYY, M, D, H, N, S ' * @param Boolean true: Das DateTimeObjekt wird selber nicht verändert - False: Das Objekt selber wird verändert ' * @return DateTime ' */ Public Function trunc( _ Optional ByVal iInterval As String = "D", _ Optional ByVal iByRef As Boolean = False _ ) As DateTime == Beispiel == 'Standartmässig wird auf den Tag gekürzt d DateTime(#8-19-2015 12:30:54#).trunc().timestamp 19.08.2015 'Auf die Stunde kürzen d DateTime(#8-19-2015 12:30:54#).trunc("H").timestamp 19.08.2015 12:00:00 'und auf den Monat d DateTime(#8-19-2015 12:30:54#).trunc("M").timestamp 01.08.2015 ==== round() ==== Set dt2 = dt1.round([interval [,Rückgabeart]]) Rundet den Timestamp auf die entsprechende Grösse. Analog zu [[#runc()]]. '/** ' * Rundet den Timestamp ' * @example DateTime(#2014-04-05 13:15:56#).round("H") --> 05.04.2014 13:00:00 ' DateTime(#2014-04-05 13:34:14#).round("H") --> 05.04.2014 14:00:00 ' * @param String Interval-String gem. DateAdd(). YYYY, M, D, H, N, S ' * @param Boolean true: Das DateTimeObjekt wird selber verändert - False: Das Objekt selber wird nicht verändert ' * @return DateTime ' */ Public Function round( _ Optional ByVal iInterval As String = "D", _ Optional ByVal iByRef As Boolean = C_DEFAULT_BYREF _ ) As DateTime == Beispiel == d DateTime(#2016-03-18#).round("M").dateValue 01.04.2016 d DateTime(#2016-03-14#).round("M").dateValue 01.03.2016 'Erster Tag der Woche d DateTime(#2016-03-18#).round("W").dateValue 21.03.2016 ==== interval() ==== myArray = dt1.interval(DateInterval, Grösse oder Enddatum [,Rückgabeart]) Diese Methode erstellt ein Array mit einer ganzen Datumserie in %%DateInterval%% abständen. '/** ' * Erstellt ein Array mit einem Interval. Als erstes Datum wird der aktuelle DateTime verwendet ' * @param DateInterval/IntervalSpec/Days ' * @param Long/DateTime/Timestamp Anzahl Einträge oder ein Endzeitpunkt ' * @param dtReturnTypes Rückgabeformat: timestamp oder DateTime ' * @return Array ' */ Public Function interval(ByRef iIntervalSpec As Variant, ByRef iSizeOrEnd As Variant, Optional ByVal iReturnType As dtReturnTypes = dtTimestamp) As Variant() == Beispiel == '3er Interval ab dem 18 März 2016. Rückgabewert ist Standartmässig als VBA.Date d DateTime(#2016-03-18#).interval("P2D", 3) ( [0] => 18.03.2016 [1] => 20.03.2016 [2] => 22.03.2016 ) '1 Woche + 1 Tag + 12 Stunden. Zudem ist das Ende über ein Datum definiert d DateTime(#2016-03-18 12:00:00#).interval("P1W1DT12H", #2016-04-10#) ( [0] => 18.03.2016 12:00:00 [1] => 27.03.2016 [2] => 04.04.2016 12:00:00 ) 'Und mit DateTime als Rückgabewert d DateTime(#2016-01-18 12:00:00#).interval(DateInterval.serial(,1), DateTime(), dtDateTime) ( [0] => ( [timestamp] => 18.01.2016 12:00:00 [dateValue] => 18.01.2016 [timeValue] => 12:00:00 ... ) [1] => ( [timestamp] => 18.02.2016 12:00:00 [dateValue] => 18.02.2016 [timeValue] => 12:00:00 ... ) [2] => ( [timestamp] => 18.03.2016 12:00:00 [dateValue] => 18.03.2016 [timeValue] => 12:00:00 ... ) ) ==== modify() ==== Set dt2 = dt1.modify(interval, Neuwert [,Rückgabeart]) Entspricht dem Setzen eines Attributes. Guibt jedoch ein DateTime zurück und kann darum direkt weiterverwendet werden '/** ' * Ersetzt einen einzelnen Teil des Datums und gibt ein DateTime zurück ' * @param String Interval-String gem. DateAdd(). YYYY, M, D, H, N, S, F, Y, WW, W ' * @param Long Neuer Wert ' * @param Boolean true: Das DateTimeObjekt wird selber nicht verändert - False: Das Objekt selber wird verändert ' * @return DateTime ' */ Public Function modify( _ ByVal iInterval As String, _ ByVal iNumber As Long, _ Optional ByVal iByRef As Boolean = False _ ) As DateTime == Beispiel == 'Einfache Anwendung: Setze den Tag eines Jahres und ändere danach das Jahr d DateTime("2015211", "YYYY@Y").modify("YYYY", 2014).timestamp 30.07.2014 'Fortlaufende anwendung. Im Unterschied zu den Attributen kann hier gleich weitergerechnet werden 'Dito zu oben, aber ermittle die Differenz zu heute d DateTime("2015211", "YYYY@Y").modify("YYYY", 2014).diff(DateTime().trunc("D")).intervalSpec '-P1Y25D' ==== setProperty() ==== Mit dieser Methode kann ein Property angepast werden und das Resultat gleich weiterverarbeiten werden. '/** ' * Setzt ein Property ung gibt ein DateTime zurück ' * @param dtProperties Info, welches Property gesetzt werden soll ' * @param Variant Wert ' * @param Boolean true: Das DateTimeObjekt wird selber verändert - False: Das Objekt selber wird nicht verändert ' * @return DateTime ' */ Public Function setProperty( _ ByVal iProperty As dtProperties, _ ByVal iValue As Variant, _ Optional ByVal iByRef As Boolean = C_DEFAULT_BYREF _ ) As DateTime == Beispiele == ? DateTime().setProperty(dtpDay,1).sqlDate #06/01/2016# ? DateTime().setProperty(dtpSqlFormat, dtSqlFormats.dtSqlIso8601).sqlDate #2016-06-27# ? DateTime().setProperty(dtpSqlFormat, dtSqlFormats.dtSqlIso8601).setProperty(dtpDay,1).sqlDate #2016-06-01# ==== toString() ==== Gibt den Timestampals String zurück. Das Format kann mitgegen werden. Ansonsten wird das mit dem Format [[#sqlTimeStamp]] formatiert. '/** ' * Gibt ein String-Wert eines Objektes zurück ' * @return String ' */ Public Property Get toString(Optional ByVal format As String) As String == Beispiele == ?DateTime().toString() #07/04/2016 10:43:24# ?DateTime().toString("DD\.MM\.YYYY") 04.07.2016 ===== Code =====