"Reichweite" des DateGadgets

Anfängerfragen zum Programmieren mit PureBasic.
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

"Reichweite" des DateGadgets

Beitrag von es_91 »

Neulich fiel mir auf, dass man mit dem DateGadget nicht einmal Jahreszahlen um 2050 abspeichern kann. Wieso nicht? Die Reichweite dieses Gadgets scheint auf etwa 2040 begrenzt zu sein. Woher kommt das? Gibt es eine Möglichkeit, die "Reichweite" zu erhöhen?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: "Reichweite" des DateGadgets

Beitrag von NicTheQuick »

Das liegt daran, dass der Unix Time Stamp dafür verwendet wird und dieser auf 32 Bit begrenzt ist. Siehe dazu auch in der PB-Hilfe das Kapitel 'Date'.
Note: supported date/time values are 1970-01-01, 00:00:00 for the minimum and 2038-01-19, 03:14:07 for the maximum.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: "Reichweite" des DateGadgets

Beitrag von edel »

Unter Windows geht das einfach mit #DTM_GETSYSTEMTIME

Code: Alles auswählen

Procedure Main()
  Protected Event
  Protected time.SYSTEMTIME
  
  If OpenWindow(0, #PB_Ignore, #PB_Ignore, 500, 500, "")
    
    DateGadget(0, 10, 10, 100, 25)
    
    
    Repeat
      Event = WaitWindowEvent()
      
      If event = #PB_Event_Gadget
        
        If SendMessage_(GadgetID(0), #DTM_GETSYSTEMTIME, 0, time) = #GDT_VALID
          
          Debug time\wYear        
          Debug time\wMonth       
          Debug time\wDayOfWeek   
          Debug time\wDay         
          Debug time\wHour        
          Debug time\wMinute      
          Debug time\wSecond      
          Debug time\wMilliseconds
          Debug "---------------------"
          
        Else
          Debug "Fehler"
        EndIf
        
      EndIf
      
    Until Event = #PB_Event_CloseWindow    
    
  EndIf
  
  
EndProcedure:End main()
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: "Reichweite" des DateGadgets

Beitrag von RSBasic »

Warum das so ist, findest du hier: http://de.wikipedia.org/wiki/Jahr-2038-Problem
Da gibt es auch eine Bildanimation, um es besser verstehen zu können.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: "Reichweite" des DateGadgets

Beitrag von es_91 »

Danke sehr!
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: "Reichweite" des DateGadgets

Beitrag von es_91 »

Die Animation auf Wikipedia auf der Seite zum Jahr-2038-Problem zeigt, dass nach einem bestimmten Punkt im Jahr 2038 die Zählung wieder bei 1901 oder so ähnlich beginnt. Das geschieht dadurch, dass beim Hochzählen im Sekundenschritt aus den vielen einsen (111...) plötzlich eine eins ganz "vorne" wird, das höchste Bit wird genutzt.

Das bedeutet doch, dass der Unix Time Stamp in der Lage ist, Daten vor 1970 abzuspeichern und zwar genau bis zu diesem Punkt, wo der Time Stamp 10000000... ist. Oder irre ich da?

Warum erlaubt PureBasic nur die Speicherung von Daten nach 1970, beziehungsweise warum werden die im Dezimalsystem negativen Werte des Datums nicht genutzt?

(Ich schreibe gerade ein Programm bei dem es wertvoll währe, Daten vor 1970 abzuspeichern.)

Dieses Posting geht extremst davon aus, dass "Daten" die Mehrzahl von "Datum" ist. Sollte dem nicht so sein, kannst Du den Autor gern darauf hinweisen!

EDIT: Ich korrigiere: PureBasic erlaubt die Speicherung von Daten _ab_ 1970, teoretisch sogar ab der letzten Sekunde 1969, denn gibt es eine nullte Sekunde?


Dieses Posting geht immernoch extremst davon aus, dass "Daten" die Mehrzahl von "Datum" ist. Sollte dem nicht so sein, kannst Du den Autor gern darauf hinweisen!
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: "Reichweite" des DateGadgets

Beitrag von Kurzer »

edel hat geschrieben:Unter Windows geht das einfach mit #DTM_GETSYSTEMTIME

Code: Alles auswählen

Procedure Main()
  Protected Event
  Protected time.SYSTEMTIME
  
  If OpenWindow(0, #PB_Ignore, #PB_Ignore, 500, 500, "")
    
    DateGadget(0, 10, 10, 100, 25)
...
Hallo Edel, das ist zwar ein alter post, aber für mich gerade aktuelles Thema.
Leider funktioniert diese Methode nicht für das CalendarGadget. Hier gibt Sendmessage_ <> = #GDT_VALID zurück.

Gibt es eine ähnliche Lösung für das CalendarGadget?
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: "Reichweite" des DateGadgets

Beitrag von RSBasic »

Bei mir funktioniert es.
Vielleicht liegt es an Windows XP?
https://msdn.microsoft.com/de-de/library/windows/desktop/bb761769%28v=vs.85%29.aspx hat geschrieben:Minimum supported client: Windows Vista
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: "Reichweite" des DateGadgets

Beitrag von Kurzer »

Ok, danke fürs Testen, RSBasic. Den Eintrag in der MSDN habe ich auch gelesen, aber der gilt ja eigentlich für die Message an sich, oder? Beim DateGadget funktioniert es nämlich auch unter Win XP, daher ging ich davon aus, dass es auch bei anderen Gadgets funktionieren sollte.

Hmm... nun gut, ich werde damit leben können. :)
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: "Reichweite" des DateGadgets

Beitrag von RSBasic »

Sorry Kurzer, ich war zu voreilig und habe das Ursprungsthema nicht richtig gelesen.
Damit sollte es funktionieren:

Code: Alles auswählen

EnableExplicit

Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
  Protected *NMHDR.NMHDR
  Protected SYSTEMTIME.SYSTEMTIME
  
  Select uMsg
    Case #WM_NOTIFY
      *NMHDR = lParam
      Select *NMHDR\hwndFrom
        Case GadgetID(1)
          Select *NMHDR\code
            Case #DTN_DATETIMECHANGE
              SendMessage_(GadgetID(1), #MCM_GETCURSEL, 0, SYSTEMTIME)
              Debug Str(SYSTEMTIME\wDay) + "." + Str(SYSTEMTIME\wMonth) + "." + Str(SYSTEMTIME\wYear)
          EndSelect
      EndSelect
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  DateGadget(1, 10, 10, 100, 20)
  
  SetWindowCallback(@WinCallback())
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf
Ich hoffe, bei dir unter Windows XP auch.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten