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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

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

Beitrag 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
Zuletzt geändert von Nino am 06.06.2011 16:50, insgesamt 1-mal geändert.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag von cxAlex »

Danke. Ich werde das mal so einbauen :)

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

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

Beitrag 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
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag von cxAlex »

Interessant. In meiner VBox funktioniert die Linux Version perfekt (Ubuntu 11.04).
Mal sehen was sich da machen lässt....

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

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

Beitrag von NicTheQuick »

ST: 17:28:58
UTC: 15:28:58
Dabei ist die aktuelle Uhrzeit 17:28:58 Uhr.
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

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

Beitrag 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$)
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

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

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Antworten