Timestamps (u.a. bei Bookmarks )

(25.07.2011) Beim Wechsel des Browser muss man immer auch die Bookmarks irgenwie in die neue Welt bekommen. Dabei funktionierten die Import- und Exportfunktionen unterschiedlich gut. Nachdem ich mein System neu aufgesetzt habe ( neue Festplatte und Win7-64 ) stellte sich die Frage nach dem neuen Browser. Mit dem IE wollte ich nicht mehr. Um Firefox und Co wird mir zu viel Gewese gemacht. Bei Tests war Google-Chrome immer schon recht flott unterwegs, einzig die Googleeigene Neugier, die im Browser verankert ist, ließ mich zweifeln.

Aber da Chrome quelloffen ist, konnte eine findige Firma die zweifelhaften Passagen im Code eliminieren und schuf so einen schnellen Browser, der “dicht hält”: Iron ( von SRWare).

Irgendwie hat der Import der Bookmarks nicht so geklappt, wie erhofft. Also habe ich mir die Datei angesehen, ob man nicht irgendwas draus machen kann. Erster Stolperstein war das Datumsformat des Timestamp. Auf den ersten Blick ein Buch mit sieben Siegeln. Also den allwissenden Dr. Goolge gefragt uns siehe da, es ist ganz einfach es handelt sich um die Zeit in (Milli-) Sekunden , die seit 01.01.1970 0:00 Uhr vergangen ist.

Ob Milli- oder nur Sekunden erkennt man an der Zahlenlänge.
10 stellig = Sekunden
Für diesen Fall einfach den Timestamp durch 86400 (= 24 h * 60 Min * 60 Sek) dividieren und schon hat man die Tage seit 1970. 
Für Exceljaner heißt das 25569 (01.01.1970) dazu addiert und schon hat man das Datum des Eintrages.
Alles klar?

Update 27.08.2012

Die Umrechnung der Timestamps ist irgendwie nur die halbe Wahrheit. Je nach Systemeinstellungen muss man noch einen Offset (Auf- oder Abschlag) zur GMT und ggf. die Umstellung auf Sommer- bzw. Winterzeit berücksichtigen. Da ich die Umrechnung zum Portieren meines Geburtstagskalender brauchte, habe ich eine entsprechende kleine Funktion geschrieben:

Private Function sommerzeit(dat As Date)

'Feststellen ob das Datum in der Sommerzeit liegt
'Wenn auch  mit Uhrzeiten gerechnet werden soll, also nicht nur mit glatten Datumswerten (0:00 Uhr)
'muss die Uhrzeit bei der Ermitllung ob Sommerzeit noch berücksichtigt werden...

  a = DateSerial(Year(dat), 3, 31) - (Weekday(DateSerial(Year(dat), 3, 31), vbMonday))
  b = DateSerial(Year(dat), 10, 31) - (Weekday(DateSerial(Year(dat), 10, 31), vbMonday))
  If dat > a And dat <= b Then
    sommerzeit = True
  Else
    sommerzeit = False
  End If
  
End Function

Private Function date2timestamp(datum As Variant, Optional GMT_offset As Integer)
Dim c As Double
'Umwandeln eines Datums in Unix Timestamp
If Not IsDate(datum) Then
   date2timestamp = CVErr(xlErrNA) 'Fehler zurückgeben... #NV
Else
    a = datum - 25569              ' das magische Datum 01.01.1970 = 25569
    b = GMT_offset                 'Unterschied Zeitzone - Deutschland +1
    If sommerzeit(CDate(datum)) Then b = b + 1  'Unterschied Zeitzone bei Sommerzeit
    b = b / 24                     'Umwandeln in Bruchteil Tage
    a = a - b                      'Basis für Timstamp um Zeitzone bereinigen
    c = 86400                      'Sekunden am Tag 24 * 60 * 60 = 86400
    date2timestamp = a * c         'Timestamp errechnen
    End If
End Function

Schreib was...