Die Start- und Endzeit einer Aufnahme wird in einer Computerzeit, die fortlaufend ab '1.1.1970 00:00' beginnt, als 10 stellige Integerzahl dort eingetragen.
Das nennt sich UNIX-Zeit und Gambas unterstuetzt die in der gb.util-Komponente:
gambas code
' gb.util muss geladen sein
Print Date.ToUnixTime(CDate("01/01/1970 00:00:00"))
' > 0
gambas codeCDatum = ("01/01/1970 00:00:00")
Print Format$(CDatum, "dd.mm.yyyy hh:nn:ss")
Als Ergebnis bekomme ich: 01.01.1970 02:00:00
Da mach ich doch was falsch, oder warum zeigt das Ergebnis 2 Uhr an?
Du hast Format$() verwendet. Format$() ist zur Anzeige eines Wertes fuer den Nutzer am Bildschirm gedacht und beruecksichtigt folgerichtig die aktuelle Zeitzone des Systems. Die UNIX-Epoche begann zu einem Zeitpunkt, der in UTC 0 Uhr war, bei dem aber gleichzeitig in Deutschland die Uhren auf 2 Uhr standen (plus/minus
Sommerzeit). Willst du dem Benutzer in Berlin, Shanghai oder Syndney aus irgendwelchen Gruenden die Zeit formatiert anzeigen, die sein Kollege in Greenwich sehen sollte, dann musst du das Date-Objekt mit ToUTC behandeln. Das subtrahiert die aktuelle Zeitzone:
gambas codeDim dValentin As Date
' Der Zeitpunkt 1234567890 in der UNIX-Epoche, wie ihn Leute in Deutschland (Sommerzeit) gesehen haben
dValentin = Date.FromUnixTime(1234567890)
Print dValentin
Print Format$(dValentin, "dd.mm.yyyy hh:nn:ss")
' > 02/14/2009 01:31:30
' > 14.02.2009 01:31:30
' Der gleiche Zeitpunkt fuer Leute, die in UTC-Land auf die Uhr geschaut haben
dValentin = Date.ToUTC(dValentin)
Print dValentin
Print Format$(dValentin, "dd.mm.yyyy hh:nn:ss")
' > 02/13/2009 23:31:30
' > 13.02.2009 23:31:30
Aber Vorsicht mit den Konvertierungsroutinen! Es gibt in Gambas zwei Ebenen von Datumskonversion. Die untere Ebene beruecksichtigt die aktuelle Zeitzone *nicht*, sondern fuehrt nur numerische Operationen aus; zu dieser Ebene zaehlen alle Funktionen, die mit einem C beginnen: CStr, CInt, CFloat, CDate. Die obere Ebene ist fuer die Anzeige beim Benutzer gedacht und beruecksichtigt die aktuelle Zeitzone. Zu dieser Ebene gehoeren Str$(), Val() und Format$(). Man sollte die beiden Ebenen nur dann mischen, wenn man sich wirklich im Klaren darueber ist, was man tut.
Oben habe ich mit ToUTC die aktuelle Zeitzone von dValentin abgezogen, damit Format$() sie mir in meiner Zeitzone so anzeigt, wie sie eigentlich in der UTC-Zeitzone angezeigt wird. Ich habe den Datumswert korrigiert, damit Format$() ihn wieder zurueckkorrigiert, in das, was ich sehen will. Was passiert, wenn ich aber nicht mehr Format$(), sondern CStr() verwende?
gambas codePrint CStr(dValentin)
Print Date.ToUnixTime(dValentin)
' > 02/13/2009 21:31:30
' > 1234560690
Hier wird meine +0200 Berlin
Sommerzeit nicht beruecksichtigt und ich sehe, dass die eigentlich gespeicherte Zeit nun nicht mehr mit dem urspruenglichen Zeitstempel uebereinstimmt.
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!