Seite 1 von 2
CalendarGadget neues Datum nachträglich setzen
Verfasst: 04.08.2022 16:05
von mbergmann_sh
Hallo zusammen,
ich möchte unter PureBasic 6 einem CalendarGadget nachträglich ein anders Datum zuweisen. In meiner Anwendung wird das Gadget mit dem Tagesdatum (Default) geöffnet:
Code: Alles auswählen
calGeburtsdatum = CalendarGadget(#PB_Any, 20, 220, 178, 160, 0, #PB_Calendar_Borderless)
- das Gadget zeigt erwartungsgemäß das Datum des heutigen Tages (4.8.2022).
Nun versuche ich, mein Geburtsdatum zuzuweisen:
Code: Alles auswählen
geburtsdatum = Date(1961,9,26,0,0,0)
SetGadgetState(calGeburtsdatum, geburtsdatum)
Tatsächlich ändert sich auch das Datum - heraus kommt dabei aber Unsinn. Anstatt den 26.09.1961 anzuzeigen, zeigt das Gadget nun den 7. Februar 2106 an. Was mache ich falsch - wie setze ich ein bestimmtes Datum in einem Calendargadget korrekt?
Besten Dank für Eure Hinweise!
Re: CalendarGadget neues Datum nachträglich setzen
Verfasst: 04.08.2022 16:20
von Kiffi
Aus der
PB-Hilfe:
Die 'Date' (Datums) Bibliothek ermöglicht den Umgang mit Datums- und Zeitangaben
zwischen 1970 und 2038. Benutzt wird dabei die Unix-32-Bit-Methode (d.h. die Anzahl der seit dem 1. Januar 1970 vergangenen Sekunden).
Hinweis: Unterstützte Datums-/Zeit-Werte sind 01.01.1970, 00:00:00 als Minimum und 19.01.2038, 03:14:07 als Maximum. Siehe auch
https://de.wikipedia.org/wiki/Jahr-2038-Problem.
Mögliche Lösung Deines Problems:
viewtopic.php?p=360707#p360707
Re: CalendarGadget neues Datum nachträglich setzen
Verfasst: 04.08.2022 17:57
von mbergmann_sh
Wow, ich check es nicht. Setze ich ein Datum ab dem 1.1.1970, so ist alles gut und funktioniert. Macht ja auch Sinn.
Gebe ich das Minimum des Gadgets mit
Code: Alles auswählen
SetGadgetAttribute(calGeburtsdatum, #PB_Calendar_Minimum, 1955)
an und setze danach einen Wert vor 1970, so kommt der selbe Unsinn heraus, den ich vorher auch hatte.
Re: CalendarGadget neues Datum nachträglich setzen
Verfasst: 04.08.2022 18:25
von jacdelad
Kein Unsinn. Im Prinzip werden Zeiteinheiten seit dem 1.1.1970 gezählt. Irgendwann gibt es einen Variablenüberlauf, dann fängt es wieder bei 0 an.
Wenn du ein Datum vor 1970 wählst passiert in etwa das gleiche, nur quasi rückwärts. Du bewegst dich außerhalb von 1970 und 2038 in ungültigen Wertebereichen, die die variable, in der das Datum gespeichert wird, nicht verarbeiten kann. Deswegen hatte Kiffi ja die Hilfe zitiert, in der steht genau drin, dass das Universum vor 1970 nicht existiert hat.
Re: CalendarGadget neues Datum nachträglich setzen
Verfasst: 04.08.2022 18:30
von jacdelad
Stell dir vor, das Datum würde in einem Byte gespeichert werden. Das Byte hat 256 Zustände. Du fängst mit dem 1. Januar an, das Byte hat den Wert 0. der 2. Januar wäre 1, der 3. Januar 2...
Der 13. September ist der 256. Tag des Jahres, also hätte unser Byte den Wert 255. Höher geht nicht. Am 14. September beginnt das Byte wieder von 0 an zu zählen. Jetzt wissen wir aber nicht mehr, ob es der 1. Januar oder der 14. September ist.
Dein Datum liegt außerhalb des Bereichs in dem das Datumsgadget arbeitet. Es weiß nicht mehr ob das Datum nach 2038 oder vor 1970 liegt.
Re: CalendarGadget neues Datum nachträglich setzen
Verfasst: 04.08.2022 19:57
von mbergmann_sh
ja, das verstehe ich soweit. Bedeutet das im Umkehrschluss, dass Calendar- und Dategadget nicht dazu in der Lage sind, Werte vor 1970 und nach 2038 abzubilden?
Ich komme eigentlich von C++/Qt5, beschäftige mich erst seit Kurzem mit PureBasic. Unter Qt ist es kein Problem, ein DateWidget mit nahezu beliebigem Datum zu füttern.
Re: CalendarGadget neues Datum nachträglich setzen
Verfasst: 04.08.2022 20:07
von jacdelad
Ja, das ist so. Wie Kiffi zitiert hat steht das auch in der Hilfe so drin. Es gibt aber mindestens 2 Module, die das umgehen, Dank größerer Variablen. Kiffi hatte einen Link gepostet.
Re: CalendarGadget neues Datum nachträglich setzen
Verfasst: 04.08.2022 20:25
von mbergmann_sh
ja, hab ich mir angesehen und die Quelltexte für das Modul und das Beispiel getestet. Da werd ich mein Programm wohl ein bisschen umstellen müssen (...und auf EnableExplicit verzichten müssen).
War mir nicht sicher, ob ich die PB-Hilfe richtig interpretiert habe und dachte, dass da vielleicht einfach ein umständlicherer Weg doch zum Ziel führen würde.
Vielen Dank Euch allen für die Erklärungen!
Re: CalendarGadget neues Datum nachträglich setzen
Verfasst: 04.08.2022 20:33
von jacdelad
Warum auf EnableExplicit verzichten?
Der Code ist eigentlich so gestaltet, dass die Befehle nahezu identisch sind.
Re: CalendarGadget neues Datum nachträglich setzen
Verfasst: 05.08.2022 11:52
von mbergmann_sh

naja - zumindest im Beispiel muss ich diverse verwendete Variablen erstmal deklarieren, damit es mit EnableExplicit läuft.