"Reichweite" des DateGadgets
"Reichweite" des DateGadgets
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?
- 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
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
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
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.
Da gibt es auch eine Bildanimation, um es besser verstehen zu können.
Re: "Reichweite" des DateGadgets
Danke sehr!
Re: "Reichweite" des DateGadgets
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!
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
Hallo Edel, das ist zwar ein alter post, aber für mich gerade aktuelles Thema.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) ...
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.
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.
Re: "Reichweite" des DateGadgets
Bei mir funktioniert es.
Vielleicht liegt es an Windows XP?
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
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.
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.
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.
Re: "Reichweite" des DateGadgets
Sorry Kurzer, ich war zu voreilig und habe das Ursprungsthema nicht richtig gelesen.
Damit sollte es funktionieren:
Ich hoffe, bei dir unter Windows XP auch.
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