Seite 1 von 3

"Reichweite" des DateGadgets

Verfasst: 04.11.2013 18:35
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?

Re: "Reichweite" des DateGadgets

Verfasst: 04.11.2013 18:48
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.

Re: "Reichweite" des DateGadgets

Verfasst: 04.11.2013 19:46
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()

Re: "Reichweite" des DateGadgets

Verfasst: 04.11.2013 19:53
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.

Re: "Reichweite" des DateGadgets

Verfasst: 05.11.2013 00:02
von es_91
Danke sehr!

Re: "Reichweite" des DateGadgets

Verfasst: 28.01.2014 04:29
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!

Re: "Reichweite" des DateGadgets

Verfasst: 18.12.2015 00:25
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?

Re: "Reichweite" des DateGadgets

Verfasst: 18.12.2015 00:32
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

Re: "Reichweite" des DateGadgets

Verfasst: 18.12.2015 00:36
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. :)

Re: "Reichweite" des DateGadgets

Verfasst: 18.12.2015 01:23
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.