RSS
StartseiteKnowledge LibraryTop 10Impressum

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