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?
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.