User Tools

Site Tools


vba:classes:date:datetime:index

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:classes:date:datetime:index [30.03.2016 14:34:54]
yaslaw
vba:classes:date:datetime:index [04.07.2016 10:46:14] (current)
yaslaw
Line 1: Line 1:
 {{keywords>​vba,​datetime}} {{keywords>​vba,​datetime}}
 <​const>​ <​const>​
-    version=1.8.0 +    version=1.10.0 
-    vdate=30.03.2016+    vdate=04.07.2016
     fname=datetime.cls     fname=datetime.cls
     ns=%NAMESPACE%     ns=%NAMESPACE%
Line 10: Line 10:
 ==Version %%version%% %%vdate%%== ==Version %%version%% %%vdate%%==
 Die Klasse DateTime beinhaltet alle Möglichen Funktionen rund um das Datum. ​ 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.
  
 <WRAP round download 50%> <WRAP round download 50%>
Line 18: Line 20:
 </​WRAP>​ </​WRAP>​
  
-<​WRAP ​center ​round important ​60%> +<WRAP round important ​50%> 
-Mit der Version 1.8.0 wurde das Verhalten des Paramters [[#​Allgemein:​ Rückgabeparamter iByRef (Rückgabewert)]] verändert. ​Nue 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+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
 </​WRAP>​ </​WRAP>​
  
- +===== Abhängigkeiten ===== 
-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 [[vba:​classes:​date:​dateinterval:​index]] muss ebenfalls installiert sein:  
- +{{:​vba:​classes:​date:​dateinterval.cls|}}
-<note important>​Die Klasse [[vba:​classes:​date:​dateinterval:​index]] muss ebenfalls installiert sein:  +
-{{:​vba:​classes:​date:​dateinterval.cls|}}</​note>​+
  
 Die ganze Geschichte mit Zeitzonen ist noch nicht umgesetzt. Wird sicher lustig mit der Nordkoreanischen Halbstundenversetzung. 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 ===== ===== Definitionen =====
 > Für die Ausgabe der Resultate verwendete ich die Funktion [[:​vba:​functions:​print_r:​|print_r() bzw. d()]]. > Für die Ausgabe der Resultate verwendete ich die Funktion [[:​vba:​functions:​print_r:​|print_r() bzw. d()]].
 +
 ==== Creatoren ==== ==== Creatoren ====
 Es gibt verschiedene Möglichkeiten ein DateTime zu initialisieren Es gibt verschiedene Möglichkeiten ein DateTime zu initialisieren
Line 52: Line 59:
 | [[#modify]] | %%DateTime%% | Ändern eines speziellen Wertes | | [[#modify]] | %%DateTime%% | Ändern eines speziellen Wertes |
 | [[#​interval]] | Array | Erstellt eine Serie von Daten anhand eines Intervals | | [[#​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 ==== ==== Attribute ====
Line 75: Line 91:
 | week | Long | Woche im Jahr | WW | | week | Long | Woche im Jahr | WW |
 | year | Integer | Jahr | YY oder YYYY ((2 bzw. 4 Stellige Zahl)) | 2016 | | 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 Beispiel für die Werte
Line 100: Line 119:
     [dayOfWeekName] => <​String>​ '​Mittwoch'​     [dayOfWeekName] => <​String>​ '​Mittwoch'​
     [dayOfYear] => <​Long>​ 62     [dayOfYear] => <​Long>​ 62
 +    [sqlTimeStamp] => <​String>​ '#​2016-03-02 11:​36:​42#'​
 +    [sqlDate] => <​String>​ '#​2016-03-02#'​
 +    [sqlTime] => <​String>​ '#​11:​36:​42#'​
 +    [sqlFormat] => <​Long>​ 16
 +    [returnType] => <​Long>​ 0
 +    [sqlDateFormatString] => <​String>​ '​YYYY-MM-DD'​
 +)
 )</​code>​ )</​code>​
 +
 +==== Enumeratoren ====
 +Es gibt verscheidene öffentliche Enumeratoren.
 +
 +=== dtParams ===
 +dtParams steuert das Verhalten der Klasse. Die verschiedenen Paramter sind komulierbar,​ wobei nicht alle Kombinationen Sinn ergeben
 +<code vb>​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</​code>​
 +
 +=== dtSqlFormats ===
 +Paramter um das SQL-Format zu setzen. Es sind alle auch in dtParams vorhanden.
 +<code vb>​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</​code>​
 +
 +=== dtReturnTypes ===
 +Bei gewissen Methoden kann man das Rückgabetype auswählen
 +<code vb>​Public Enum dtReturnTypes
 +    dtDateTime = 2 ^ 15     '​dtOutDateTime
 +    dtTimestamp = 2 ^ 16    '​dtOutTimestamp
 +    dtRetDefault = dtDateTime
 +End Enum</​code>​
 +
 +=== dtErrorNumbers ===
 +Mögliche Errors. Normalerweise programmiere ich dazu Public Const. Das geht aber in eine Class nicht.
 +<code vb>​Public Enum dtErrorNumbers
 +    dtErrInvalidFormat = vbObjectError + 1      'Der String passt nicht mit dem Format überein
 +    dtErrNotParseble = vbObjectError + 2        'Das Format ist nicht parsbar
 +End Enum</​code>​
 +
 +=== dtProperties ===
 +Attribute, die gesetzt werden können. Wird für [[#​setProperty]] genutzt
 +<code vb>​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</​code>​
  
 ===== Creatoren ===== ===== 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
 +<code vb>d DateTime().timestamp
 +<​Date>​ 30.03.2016 15:10:51
 +
 +d DateTime(now).timestamp
 +<​Date>​ 30.03.2016 15:11:00
 +
 +d DateTime(Null).timestamp
 +<​Date>​ 30.03.2016 15:11:12
 +
 +d DateTime(""​).timestamp
 +<​Date>​ 30.03.2016 15:​11:​25</​code>​
 +
 +=== Fixer TimeStamp ===
 +Es können verschiedene Date oder Time übergeben werden. Natürlich auch aus Date-Variablen
 +<code vb>d DateTime(#​2016-03-15 12:​00:​00#​).timestamp
 +<​Date>​ 15.03.2016 12:00:00
 +
 +d DateTime(#​2016-03-15#​).timestamp
 +<​Date>​ 15.03.2016
 +
 +d DateTime(#​12:​00:​00#​).timestamp
 +<​Date>​ 12:​00:​00</​code>​
 +
 +Und dasselbe mit Datumsstring. Es funktionieren auch Formatiert Strings analog zu [[vba:​cast:​strtodate]]
 +<code vb>d DateTime("​2016-02-18"​).timestamp
 +<​Date>​ 18.02.2016
 +
 +d DateTime("​20160218",​ "​YYYYMMDD"​).timestamp
 +<​Date>​ 18.02.2016
 +
 +d DateTime("​20160218",​ "​{$YYYY}{$MM}{$DD}",​ dtInFormatFormat2).timestamp
 +<​Date>​ 18.02.2016</​code>​
 +
 +Auch DateTime Objekte können übergeben werden.
 +<code vb>d DateTime(DateTime()).timestamp
 +<​Date>​ 30.03.2016 15:​19:​13</​code>​
 +
 +=== 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
 +<​code>​d DateTime("​P3D"​).dateValue
 +<​Date>​ 02.04.2016
 +
 +d DateTime(DateInterval("​P3D"​)).dateValue
 +<​Date>​ 02.04.2016
 +
 +d DateTime("​-P3D"​).dateValue
 +<​Date>​ 27.03.2016</​code>​
 +
 +
 ==== construct() ==== ==== construct() ====
 <​code>​Set obj2 = obj1.construct([timestamp][,​ format[, FormatParams[,​ FirstDayOfWeek[,​ FirstWeekOfYear]]]])</​code>​ <​code>​Set obj2 = obj1.construct([timestamp][,​ format[, FormatParams[,​ FirstDayOfWeek[,​ FirstWeekOfYear]]]])</​code>​
Line 222: Line 372:
 Dieser sagt aus, ob das Objekt selber verändert und zurückgegeben wird oder ob das Resultat eine neue DateTime-Instanz ist Dieser sagt aus, ob das Objekt selber verändert und zurückgegeben wird oder ob das Resultat eine neue DateTime-Instanz ist
  
-  * FALSE <​del>​(Default)</​del>​((Seit Version 1.8.0 nicht mehr)): Das Objekt selber wird veränder und eine Referenz wird zurückgegeben +  * FALSE <​del>​(Default)</​del>​((Seit Version 1.8.0 nicht mehr)): Der Rückgabewert ist ein Clone an dem die Veränderung vorgenommen wurde
-  * TRUE (Default): 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 == == Beispiel ==
Line 236: Line 386:
     'Die Veränderung nur als neues Objekt zurückgeben     'Die Veränderung nur als neues Objekt zurückgeben
     Set dt1 = DateTime(#​6/​1/​2015#​)     Set dt1 = DateTime(#​6/​1/​2015#​)
-    Set dt2 = dt1.minus("​P1M", ​True)+    Set dt2 = dt1.minus("​P1M", ​False)
     print_r dt1.dateValue ​      '​->​ <​Date>​ 01.06.2015     print_r dt1.dateValue ​      '​->​ <​Date>​ 01.06.2015
     print_r dt2.dateValue ​      '​->​ <​Date>​ 01.05.2015     print_r dt2.dateValue ​      '​->​ <​Date>​ 01.05.2015
Line 250: Line 400:
     print_r dt2.dateValue ​      '​->​ <​Date>​ 01.07.2015</​code>​     print_r dt2.dateValue ​      '​->​ <​Date>​ 01.07.2015</​code>​
  
 +=== 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
 +<code vb>d DateTime().trunc("​WW"​).add("​P4W"​).diff().days
 +<​Long>​ 26</​code>​
 +
 +'​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
 +<code vb>d DateTime().modify("​M",​ 6).modify("​D",​ 3).getLastDayOfWeek.format("​D MMMM YYYY")
 +<​String>​ '5 Juni 2016'</​code>​
 +
 +Und dasselbe. Jedoch eine Monat weniger, dafür mehr Tage als der Mai hat..
 +<code vb>d DateTime().modify("​M",​ 5).modify("​D",​ 34).getLastDayOfWeek.format("​D MMMM YYYY")
 +<​String>​ '5 Juni 2016'</​code>​
 ==== add()/​minus() ==== ==== add()/​minus() ====
 <​code>​Set dt2 = dt1.add(DateInterval [,​Rückgabeart]) <​code>​Set dt2 = dt1.add(DateInterval [,​Rückgabeart])
Line 497: Line 662:
 ) )
 </​code>​ </​code>​
- 
- 
- 
- 
  
 ==== modify() ==== ==== modify() ====
Line 527: Line 688:
 d DateTime("​2015211",​ "​YYYY@Y"​).modify("​YYYY",​ 2014).diff(DateTime().trunc("​D"​)).intervalSpec d DateTime("​2015211",​ "​YYYY@Y"​).modify("​YYYY",​ 2014).diff(DateTime().trunc("​D"​)).intervalSpec
 <​String>​ '​-P1Y25D'</​code>​ <​String>​ '​-P1Y25D'</​code>​
 +
 +==== setProperty() ====
 +Mit dieser Methode kann ein Property angepast werden und das Resultat gleich weiterverarbeiten werden.
 +<code vb>'/​**
 +' * 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</​code>​
 +
 +== Beispiele ==
 +<code vb>? 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#</​code>​
 +
 +==== toString() ====
 +Gibt den Timestampals String zurück. Das Format kann mitgegen werden. Ansonsten wird das mit dem Format ​ [[#​sqlTimeStamp]] formatiert.
 +<​code>'/​**
 +' * Gibt ein String-Wert eines Objektes zurück
 +' * @return String
 +' */
 +Public Property Get toString(Optional ByVal format As String) As String</​code>​
 +
 +== Beispiele ==
 +<code vb>?​DateTime().toString()
 +#07/04/2016 10:43:24#
 +
 +?​DateTime().toString("​DD\.MM\.YYYY"​)
 +04.07.2016</​code>​
  
 ===== Code ===== ===== Code =====
 <source '​%%fpath%%/​%%fname%%'​ vb> <source '​%%fpath%%/​%%fname%%'​ vb>
vba/classes/date/datetime/index.1459341294.txt.gz · Last modified: 30.03.2016 14:34:54 by yaslaw