Globales Datum
Datum/Zeit Angaben in Internet/RFC konforme Zeitinformationen konvertieren
Beim Versand von z.B. eMails, sollten natürlich Informationen zum Absendezeitpunkt nicht fehlen. Die schlichte und über die Format$- Funktion schnell zusammengestellte Angabe im Format "dd.mm.yy hh:nn" geht aber nicht mit den Standards konform. Wie man diesem Ziel mit Bordmitteln und einem API Aufruf näher kommt, zeigt dieser Artikel.
Kaum eine Anwendung kommt heutzutage mehr, um die Nutzung des Internet herum. Gerade beim Versand von z.B. eMails, sollten Informationen zum Absendezeitpunkt nicht fehlen. Aber die schlichte Angabe im Format "dd.mm.yyyy hh:nn:ss" würde den geltenden Standards widersprechen und genügt somit nicht. Das Format für die Datum/Zeitangabe für die Internetkommunikation ist in den RFC (Request For Comments) festgelegt, genauer in den RFC 1123.
Nach diesem Standard muss die Angabe des Datums folgendes Format haben:
ddd, dd mmm yyyy hh:nn[:ss] Zeitzone|+/- Zeitverschiebung
Die Zusammensetzung der Angaben zu Datum und Zeit stellt kein größeres Problem dar, auch wenn man von der Format$-Funktion teilweise im Stich gelasssen wird, da diese nur die lokalisierten Wochentage und Monate anzubieten hat. Die Kürzel (3 Zeichen) für den Tag und Monat folgen aber der englischen Schreibweise und werden Mithilfe der Mid$-Funktion, in Verbindung mit der WeekDay- bzw. Month-Funktion, aus den Konstanten WEEKDAYS und MONTHS ermittelt, in denen die Bezeichnungen der Wochentage und Monate in einem Stück abgelegt wurden. Die übrigen Angaben liefert die Format$-Funktion mit den entsprechenden Parametern.
Die Informationen zur Zeitverschiebung gegen GMT/UTC lässt sich über die API Funktion GetTimeZoneInformation ermitteln. Die Rückgabe dieser Funktion gibt an, ob Normalzeit oder Sommerzeit gilt, die Mitglieder bias, StandardBias und DaylightBias der TIME_ZONE_INFORMATION Struktur, enthalten die Angaben zur Zeitverschiebung in Minuten.
Private Const TIME_ZONE_ID_UNKNOWN = 0 Private Const TIME_ZONE_ID_STANDARD = 1 Private Const TIME_ZONE_ID_DAYLIGHT = 2 Private Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type Private Type TIME_ZONE_INFORMATION bias As Long StandardName(1 To 64) As Byte StandardDate As SYSTEMTIME StandardBias As Long DaylightName(1 To 64) As Byte DaylightDate As SYSTEMTIME DaylightBias As Long End Type Private Declare Function GetTimeZoneInformation Lib "kernel32" _ (ByRef lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long Private Const WEEKDAYS = "SunMonTueWedThuFriSat" Private Const MONTHS = "JanFebMarAprMayJunJulAugSepOctNovDec" Public Function RFCDateTime(ByVal DateTime As Date) As String Dim tTZI As TIME_ZONE_INFORMATION Dim lngBias As Long Dim strRFCDate As String strRFCDate = Mid$(WEEKDAYS, WeekDay(DateTime, vbSunday) * 3 - 2, 3) & ", " strRFCDate = strRFCDate & Format$(DateTime, "dd") & " " strRFCDate = strRFCDate & Mid$(MONTHS, Month(DateTime) * 3 - 2, 3) & " " strRFCDate = strRFCDate & Format$(DateTime, "yyyy") & " " strRFCDate = strRFCDate & Format$(DateTime, "hh:nn:ss") & " " If (GetTimeZoneInformation(tTZI) = TIME_ZONE_ID_DAYLIGHT) Then lngBias = tTZI.bias + tTZI.DaylightBias Else lngBias = tTZI.bias + tTZI.StandardBias End If lngBias = -lngBias Select Case lngBias Case Is > 0 strRFCDate = strRFCDate & "+" & Format$((lngBias \ 60), "00") & _ Format$((lngBias Mod 60), "00") Case Is < 0 strRFCDate = strRFCDate & Format$((lngBias \ 60), "00") & _ Format$((-lngBias Mod 60), "00") Case Else strRFCDate = strRFCDate & "GMT" End Select RFCDateTime = strRFCDate End Function
- [06.10.2001]
- - "Neufundland-Bug" ausgemerzt - Zeitzonenverschiebung ergab "-02-30" (Hinweis von Mathias Schiffer)
- Modul modRFCDateTime und Beispielprojekt (rfcdatetime.zip - 4 KB)