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)