Seite 1 von 2

[API: Win/Linux/OsX] UTC auslesen, Korrektur unter Windows?

Verfasst: 06.06.2011 13:09
von cxAlex
Ich benötige für ENM eine Funktion um die UTC - Zeit Crossplatform unter Windows, Linux und OS X auszulesen. Unter Windows und Linux habe ich das ganze schon zum laufen gebracht, für OS X fehlt mir jeder Ansatz. Was mich stutzig macht ist das ich beim ermitteln der Zeit mit der Windows - API einen Korrekturfaktor von 60 Minuten einrechnen muss obwohl davon nichts im MSDN steht, unter Linux jedoch nicht. Das ganze habe ich auch schon auf mehreren Rechnern getestet. Wird die Zeit bei euch korrekt angezeigt, bzw. hat jemand einen Ansatz für OS X?

Code: Alles auswählen

CompilerIf Defined(timezone, #PB_Structure) = #False
  Structure timezone
    tz_minuteswest.l
    tz_dsttime.l
  EndStructure
CompilerEndIf

; UTC - Zeit ermitteln
Procedure UTCTime()
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      Protected UtcOs.TIME_ZONE_INFORMATION
      GetTimeZoneInformation_(@UtcOs)
      ProcedureReturn Date() + (UtcOs\Bias-60)*60
      
    CompilerCase #PB_OS_Linux
      Protected tv.q, tz.timezone
      gettimeofday_(@tv, @tz)
      ProcedureReturn Date() + tz\tz_minuteswest*60
      
    CompilerCase #PB_OS_MacOS
      
  CompilerEndSelect  
EndProcedure

MessageRequester("", "ST: " + FormatDate("%hh:%ii:%ss", Date()) + Chr(13) + "UTC: "+FormatDate("%hh:%ii:%ss", UTCTime()))
Gruß, Alex

Re: [API: Win/Linux/OsX] UTC auslesen, Korrektur unter Windo

Verfasst: 06.06.2011 15:39
von Nino
cxAlex hat geschrieben:Wird die Zeit bei euch korrekt angezeigt [...]?
Nur unter Windows getestet:

Momentan ja, weil hier jetzt gerade Sommerzeit ist. Nach dem Ende der Sommerzeit würde dein Programm jedoch die falsche Zeit anzeigen.

Statt

Code: Alles auswählen

ProcedureReturn Date() + (UtcOs\Bias-60)*60
schreibe besser

Code: Alles auswählen

ProcedureReturn Date() + (UtcOs\Bias + UtcOs\DaylightBias)*60
Ich bin mir allerdings nicht sicher, ob Windows nach Ende der Sommerzeit den Wert von UtcOs\DaylightBias automatisch auf 0 setzt. Falls nicht, müsste der Rückgabewert von GetTimeZoneInformation_() entsprechend berücksichtigt werden. Er sollte sowieso in jedem Fall ausgewertet werden, um darauf reagieren zu können, wenn er TIME_ZONE_ID_UNKNOWN ist.

Grüße, Nino

Re: [API: Win/Linux/OsX] UTC auslesen, Korrektur unter Windo

Verfasst: 06.06.2011 15:58
von cxAlex
Danke. Ich werde das mal so einbauen :)

Gruß, Alex

Re: [API: Win/Linux/OsX] UTC auslesen, Korrektur unter Windo

Verfasst: 06.06.2011 16:37
von Shardik
cxAlex hat geschrieben:Wird die Zeit bei euch korrekt angezeigt [...]?
Bei mir in Linux (andLinux/Kubuntu 9.04) wird die UTC-Zeit nicht korrekt angezeigt. Sie ist
identisch mit der lokalen Zeit auf meinem PC. In Windows XP auf demselben Rechner wird
sie hingegen korrekt angezeigt:

UTC + 2 = MESZ (Mitteleuropäische Sommerzeit)

Der Grund dafür dürfte darin liegen, daß gettimeofday() die timezone-Struktur überhaupt
nicht unterstützt:
Linux man page hat geschrieben:The use of the timezone structure is obsolete; the tz argument should normally be specified as NULL. The tz_dsttime field has never been used under Linux; it has not been and will not be supported by libc or glibc. Each and every occurrence of this field in the kernel source (other than the declaration) is a bug.
Quelle: http://linux.die.net/man/2/gettimeofday

Re: [API: Win/Linux/OsX] UTC auslesen, Korrektur unter Windo

Verfasst: 06.06.2011 16:47
von cxAlex
Interessant. In meiner VBox funktioniert die Linux Version perfekt (Ubuntu 11.04).
Mal sehen was sich da machen lässt....

Gruß, Alex

Re: [API: Win/Linux/OsX] UTC auslesen, Korrektur unter Windo

Verfasst: 06.06.2011 17:30
von NicTheQuick
ST: 17:28:58
UTC: 15:28:58
Dabei ist die aktuelle Uhrzeit 17:28:58 Uhr.

Re: [API: Win/Linux/OsX] UTC auslesen, Korrektur unter Windo

Verfasst: 06.06.2011 17:46
von cxAlex
NicTheQuick hat geschrieben:
ST: 17:28:58
UTC: 15:28:58
Dabei ist die aktuelle Uhrzeit 17:28:58 Uhr.
Unter Ubuntu wie in deiner Signatur nehme ich an? Seltsam...

Gruß, Alex

Re: [API: Win/Linux/OsX] UTC auslesen, Korrektur unter Windo

Verfasst: 06.06.2011 17:56
von ts-soft
IMHO: Windows verwendet keine UTC sondern MEZ. Linux verwendet UTC es sei denn, es ist parallel zu Windows
installiert. VBOX-Systeme passen sich Ihrem Host an.

Abweichungen hiervon sollten auch nicht selten sein.

Ist finde dieses durcheinander schon lange seltsam, bin aber Froh das die versch. OS meine Bios-Uhr nicht mehr
nach Ihren geflogenheiten verstellen :mrgreen:

Re: [API: Win/Linux/OsX] UTC auslesen, Korrektur unter Windo

Verfasst: 06.06.2011 21:03
von Shardik
Bei andLinux/Kubuntu 9.04 (CoLinux, das einen modifizierten Linux-Kernel
verwendet und als Task unter Windows läuft) scheint die Fehlfunktion
möglicherweise wirklich mit Windows zusammenzuhängen, da Alex' Beispiel
in einem Xubuntu 10.04 LTS lokale Zeit und UTC korrekt anzeigt. Allerdings
zeigt Alex' Beispiel unter MacOS X 10.6.7 (Snow Leopard) ebenso wie
andLinux/Kubuntu 9.04 die UTC-Zeit falsch an (identisch mit der lokalen
Zeit).

Bei einer Google-Recherche habe ich entdeckt, daß es in praktisch jeder
Linux-Distribution eine Zeitzonen-Datenbank gibt (tz database). Man muß
die Umgebungsvariable TZ nur auf den gewünschten Kontinent plus die
gewünschte Stadt (z.B. "Australia/Sydney" oder "UTC") setzen und kann
dann "date" aufrufen. Damit läßt sich dann sehr einfach z.B. eine Weltzeituhr
mit den verschiedensten Städten erstellen. Die einzugebenden Bezeichnungen
sind in diesem Wikipedia-Eintrag definiert:
http://en.wikipedia.org/wiki/List_of_tz ... time_zones

Diese Lösung habe ich erfolgreich unter andLinux/Kubuntu 9.04, Xubuntu
10.04 LTS und MacOS X 10.6.7 getestet:

Code: Alles auswählen

DataSection
  Data.S "UTC"
  Data.S "Europe/London"
  Data.S "Europe/Berlin"
  Data.S "Europe/Moscow"
  Data.S "America/New_York"
  Data.S "Asia/Hong_Kong"
  Data.S "Australia/Sydney"
  Data.S ""
EndDataSection

Repeat
  Read.S TimeZone$

  If TimeZone$ <> ""
    SetEnvironmentVariable("TZ", TimeZone$)
    ProgramID = RunProgram("date", "", "", #PB_Program_Open | #PB_Program_Read)
  
    If ProgramID
      While ProgramRunning(ProgramID)
        Output$ + TimeZone$ + ": " + ReadProgramString(ProgramID) + #CR$
      Wend

      CloseProgram(ProgramID)
    EndIf
  EndIf
Until TimeZone$ = ""

SetEnvironmentVariable("TZ", "Europe/Berlin")

MessageRequester("Uhrzeit", Output$)

Re: [API: Win/Linux/OsX] UTC auslesen, Korrektur unter Windo

Verfasst: 06.06.2011 22:52
von cxAlex
Dann muss ich global die Zeitzone ändern nur das ich die UTC-Zeit auslesen kann? :shock:
Ich finde es irgendwie bescheiden/peinlich das man in all diesen "modernen" OS so etwas grundlegendes wie die Abfrage der UTC-Zeit so komplex gestaltet.
Bzw. für Os X finde ich auch nach längerer Google-Recherche einfach keine API dafür... .
IMHO: Windows verwendet keine UTC sondern MEZ. Linux verwendet UTC es sei denn, es ist parallel zu Windows
installiert. VBOX-Systeme passen sich Ihrem Host an.

Abweichungen hiervon sollten auch nicht selten sein.
Extrem seltsam... wahrscheinlich verhalten sich VMWare-Systeme wieder anders als VBOX oder Parallels, usw, usw. Ärgert mich gerade, ich sehe einfach nicht ein was daran so schwer sein soll. Und alleine das ich noch die Sommerzeit in Windows einrechnen muss. In der MSDN steht explizit:

Code: Alles auswählen

Remarks

All translations between UTC time and local time are based on the following formula:

UTC = local time + bias

The bias is the difference, in minutes, between UTC time and local time.
Kein Wort von Sommer/Winterzeit :evil:

Gruß, Alex