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

Für allgemeine Fragen zur Programmierung mit PureBasic.
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:Bzw. für Os X finde ich auch nach längerer Google-Recherche einfach keine API dafür... .
Shardik hat geschrieben:Diese Lösung habe ich erfolgreich unter andLinux/Kubuntu 9.04, Xubuntu
10.04 LTS und MacOS X 10.6.7 getestet:
Natürlich ist dies nur eine Art Krücke (kein "sauberer" API-Aufruf). :|
cxAlex hat geschrieben:Kein Wort von Sommer/Winterzeit :evil:
Meine Lösung berücksichtigt automatisch Sommer- und Winterzeit und das
sogar weltweit. Sollten sich Zeiten ändern, werden für die Linux-Distributionen
und für MacOS X automatisch auch Updates zur Verfügung gestellt. Allerdings
hast Du Recht damit, daß die lokale Zeit kurzfristig verändert werden muß und
am Ende wieder "restauriert" werden muß...
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:Dann muss ich global die Zeitzone ändern nur das ich die UTC-Zeit auslesen kann? :shock:
Nein, ein simples "date -u" zeigt die UTC-Zeit an ohne die aktuelle Zeit umstellen zu müssen.
So läuft es unter Linux. Auf dem Mac kann ich erst heute Abend zuhause testen, ob es mit
dem Flag -u funktioniert.

Code: Alles auswählen

ProgramID = RunProgram("date", "-u", "", #PB_Program_Open | #PB_Program_Read)
 
If ProgramID
  While ProgramRunning(ProgramID)
    Output$ + ReadProgramString(ProgramID) + #CR$
  Wend
  CloseProgram(ProgramID)
  Debug Output$  
EndIf
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

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

Beitrag von Shardik »

Entschuldigung, ich hatte ganz vergessen, das Beispiel mit "date -u"
auch auf dem Mac zu testen: es funktioniert hier genauso problemlos
wie unter Linux.
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

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

Beitrag von juergenkulow »

Hallo Shardik,

ich bin in die Bärenfallen getappt, unter Linux kann der Tag einen oder zwei Stellen haben, was den Rest des Strings verschiebt.
Und dann gibt es da noch die verschieden anderen 6900 Sprachen auf der Welt:

Code: Alles auswählen

; deutsch Tag einstellig 
$ date -u
Fr 5. Mär 08:57:28 UTC 2021
;2345678901234567890123456789
; deutsch Tag zweistellig
$ date -u
So 28. Feb 08:57:28 UTC 2021
;2345678901234567890123456789

; english
$ date -u
Tue Oct 22 20:13:04 UTC 2019
;2345678901234567890123456789

; japanisch 
$ date --utc
2008年 10月 28日 火曜日 22:08:46 UTC
; 0000000000CE8850  32 00 30 00 30 00 38 00 74 5E 20 00 31 00 30 00  2.0.0.8.t^ .1.0.
; 0000000000CE8860  08 67 20 00 32 00 38 00 E5 65 20 00 6B 70 DC 66  .g .2.8.åe .kpÜf
; 0000000000CE8870  E5 65 20 00 32 00 32 00 3A 00 30 00 38 00 3A 00  åe .2.2.:.0.8.:.
; 0000000000CE8880  34 00 36 00 20 00 55 00 54 00 43 00 00 00 00 00  4.6. .U.T.C..
Schönen Gruß
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

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

Beitrag von Shardik »

juergenkulow hat geschrieben:ich bin in die Bärenfallen getappt, unter Linux kann der Tag einen oder zwei Stellen haben, was den Rest des Strings verschiebt.
Du kannst einfach dem date-Befehl einen Formatierungs-String übergeben, um der "Bärenfalle" zu entgehen (erfolgreich getestet unter Linux Mint 19.3 x64 'Tricia' und MacOS 11.2.2 'Big Sur'):

Code: Alles auswählen

date -u "+%d.%m.%Y %H:%M" ; Ausgabe: 05.03.2021 14:11
Unter MacOS wird übrigens standardmäßig vor einem einstelligen Tag ein Leerzeichen ausgegeben (keine "Bärenfalle"), in Linux Mint 19.3 allerdings - wie von Dir angemerkt - leider nicht...
Axolotl
Beiträge: 150
Registriert: 31.12.2008 16:34

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

Beitrag von Axolotl »

Auf Console unter Windows geht date -u nicht.
Mit der Win-API kann zwischen Lokaler und System- Zeit unterschieden werden.
Ich hatte da mal was vorbereitet.

Code: Alles auswählen

Procedure.s GetDateStr(*tm.SYSTEMTIME=0, Format$="dddd',' dd'.' MMMM'.' yyyy") ;' long version -- see MSDN for further date formats (no time) 
  Protected result$, DateStr${32}, cch                                         ;' MSDN: For example, to get the date string "Wed, Aug 31 94", 
;'                                                                             ;'       the application uses the picture string "ddd',' MMM dd yy".
  cch = GetDateFormat_(#LOCALE_USER_DEFAULT, 0, *tm, Format$, @DateStr$, 32)   ;' *tm = 0 .. use the current locale system date 
  If cch 
    result$ = Left(DateStr$, cch) 
  Else 
   ;Debug GetLastError()                                                       ;' my own function with FormatMessage and so on  
  EndIf 
  ProcedureReturn result$ 
EndProcedure ;() 


Procedure.s GetTimeStr(*tm.SYSTEMTIME=0, Format$="HH':'mm':'ss")  ;' hh .. 12 hours, HH .. 24 hours 
  ; 
  ; int GetTimeFormat(LCID Locale, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCTSTR lpFormat, LPTSTR lpTimeStr, int cchTime); 
  ;            
  ; dwFlags -- remarks            
  ;   #TIME_NOMINUTESORSECONDS   ;' Do Not use minutes Or seconds.
  ;   #TIME_NOSECONDS            ;' Do Not use seconds.
  ;   #TIME_NOTIMEMARKER         ;' Do Not use a time marker.
  ;   #TIME_FORCE24HOURFORMAT    ;' Always use a 24-hour time format. 
  ; 
  ; Picture  Meaning 
  ;   h        Hours with no leading zero for single-digit hours; 12-hour clock 
  ;   hh       Hours with leading zero for single-digit hours; 12-hour clock 
  ;   H        Hours with no leading zero for single-digit hours; 24-hour clock 
  ;   HH       Hours with leading zero for single-digit hours; 24-hour clock 
  ;   m        Minutes with no leading zero for single-digit minutes 
  ;   mm       Minutes with leading zero for single-digit minutes 
  ;   s        Seconds with no leading zero for single-digit seconds 
  ;   ss       Seconds with leading zero for single-digit seconds 
  ;   t        One character time marker string, such as A or P 
  ;   tt       Multi-character time marker string, such as AM or PM 
  ; 
  ;'  i.e. "hh':'mm':'ss tt"  --> "11:29:40 PM" 
  ;  
  Protected result$, TimeStr${12}, cch 

  cch = GetTimeFormat_(#LOCALE_USER_DEFAULT, 0, *tm, Format$, @TimeStr$, 12)  
  If cch                                                                      ;:Debug "  cch = " + cch +" -->  result = " + TimeStr$, 9 
    result$ = Left(TimeStr$, cch) 
  Else 
  ;
  EndIf 
  ProcedureReturn result$ 
EndProcedure ;() 


Global ltm.SYSTEMTIME, stm.SYSTEMTIME 
Global tz.TIME_ZONE_INFORMATION 

GetLocalTime_(ltm)   ;' Retrieves the current system date and time in UTC format. 
Debug "Local  = " + GetDateStr(ltm) + " -- " + GetTimeStr(ltm) 

GetSystemTime_(stm)  ;' Retrieves the current system date and time. The system time is expressed in Coordinated Universal Time (UTC). 
Debug "System = " + GetDateStr(stm) + " -- " + GetTimeStr(stm) 

; 
; All translations between UTC and local time are based on the following formula:
;   UTC = local time + bias
; 
; The bias is the difference, in minutes, between UTC and local time.
; 
GetTimeZoneInformation_(tz) 
Debug "BIAS = " + tz\Bias 
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Antworten