Problem mit dem Date() Befehl

Für allgemeine Fragen zur Programmierung mit PureBasic.
Unimatrix Zero
Beiträge: 48
Registriert: 13.10.2004 23:47

Problem mit dem Date() Befehl

Beitrag von Unimatrix Zero »

Hallo zusammen,

Nachdem ich mich in meinem Programm nach wie vor mit Zeit- und Datumsfunktionen abmühen muß, habe ich jetzt auch noch ein Problem mit dem Date() Befehl festgestellt.

Code: Alles auswählen

Debug Hour(Date(0, 0, 0, 11, 3, 45))
Dieser Code ist zum Beispiel direkt aus der Hilfe von PB entnommen.
Bei mir kommt hier als Ergebnis 0 heraus.

Eigentlich wollte ich nur die aktuelle Systemzeit bzw. Lokale Zeit ermitteln mit folgender Procedur:

Code: Alles auswählen

Procedure.l GetSysTime()
  ProcedureReturn Date(0,0,0,Hour(Date()),Minute(Date()),Second(Date()))
EndProcedure
Debug GetSysTime()
Hier habe ich als Ergebnis -1 .

Ich habe festgestellt, daß sobald einer der ersten drei Parameter (Year, Month, Day) 0 ist, funktioniert bei mir der Date() Befehl nicht mehr.
Jetzt weiß ich natürlich nicht, seid welcher Version von PB dies der Fall ist.
Ich verwende zur Zeit 3.92 mit dem neuen Update wg. der Linklisten vom 15.11.2004 glaube ich.

Als Abhilfe blieb mir jetzt nichts anderes übrig, als momentan immer 1970 für Year, 1 für Month und 1 für den Day Parameter zu übergeben oder über die API mit GetSystemTime bzw. GetLocalTime zu gehen.

Code: Alles auswählen

Procedure GetSysTime()
  Protected SysTime.SYSTEMTIME
  GetLocalTime_(@SysTime)
  tmpSecond = (SysTime\wHour * 3600) + (SysTime\wMinute * 60) + SysTime\wSecond
  ProcedureReturn tmpSecond
EndProcedure
Debug GetSysTime()
Nur falls es jemanden interessiert.

cya
Unimatrix Zero

<= Die Welt um mich herum ist in mir =>
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

date mit Parametern verlangt auch gültige Daten
den Nullten Nullten gibt es nunmal nicht.

Nichtsdestotrotz ist da ein Bug im date()
denn date(1970,1,1,0,0,0) ergibt nicht Null wie laut Hilfe zu erwarten wäre sondern was falsches . Richtig wird es erst ab der ersten Stunde

Code: Alles auswählen

Debug "1.1.1970 00:00 Uhr "+FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss",Date(1970,1,1,0,0,0))
Debug "1.1.1970 00:01 Uhr "+FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss",Date(1970,1,1,0,1,0))
Debug "1.1.1970 01:00 Uhr "+FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss",Date(1970,1,1,1,0,0))
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
wichtel
Beiträge: 150
Registriert: 09.09.2004 08:35
Wohnort: Hattersheim

Beitrag von wichtel »

ehm, sach mal, du willst nur die aktuelle Uhrzeit, oder?

dann so:

Code: Alles auswählen

d= Date()
Debug "in sekunden: "+Str(d)

Debug "Zeit: "+Str(Hour(d))+":"+Str(Minute(d))+":"+Str(Second(d))

Debug "oder so: "+FormatDate("%hh:%ii:%ss",Date())
oder hab ich das was falsch verstanden....
PB / jaPBe jeweils aktuellste Version, seit 3.62 dabei, XP sp3 de/en & W7 en
Unimatrix Zero
Beiträge: 48
Registriert: 13.10.2004 23:47

Beitrag von Unimatrix Zero »

@ Bobobo

Das mit den Werten unter einer Stunde ist mir auch schon beim ParseDate() Befehle aufgefallen, ich habe es beim Date() Befehl gar nicht mehr getestet. Das mit den Nullen übrigens habe ich so direkt aus der Hilfe entnommen:

Hour()

Syntax

Ergebnis = Hour(Datum)
Beschreibung

Gibt den Stunden-Wert des angegebenen 'Datum's zurück. Das Ergebnis liegt immer zwischen 0 und 23.
Debug Hour(Date(0, 0, 0, 11, 3, 45)) ; gibt '11' aus.

Unterstützte OS

Windows, Linux

@ Wichtel

Danke für den Tip, aber ich wollte den Zeitwert in Sekunden (ohne Datumsanteil) ermitteln, habe mich aber vielleicht etwas misverständlich ausgedrückt.

cya

Unimatrix Zero

<= Die Welt um mich herum ist in mir =>
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Und so willst du das nicht in etwa haben??

Code: Alles auswählen

Procedure.l GetSysTime() 
  ProcedureReturn Hour(Date())*3600 + Minute(Date())*60 + Second(Date())
EndProcedure 
Debug GetSysTime()
MfG Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Unimatrix Zero
Beiträge: 48
Registriert: 13.10.2004 23:47

Beitrag von Unimatrix Zero »

@ Falko,

Danke erst mal für die Antwort.
Das Problem für mich ist nicht die Zeit in Sekunden zu ermitteln. Wie schon oben beschrieben, wäre ja sogar eine Lösung über die Api denkbar. Auch ist mir bewußt, daß viele Wege nach Rom führen :) .
Mir kam es mehr darauf an, zu zeigen, daß der Date() Befehl nicht mehr wie dokumentiert funktioniert und schlimmer noch, er gibt falsche Werte zurück.

cya

Unimatrix Zero

<= Die Welt um mich herum ist in mir =>
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Jetzt habe ich's verstanden was du meinst. Entweder ist die Hilfe
falsch oder es ist schon seit PB3.72 ein Bug
:mrgreen:
http://www.purearea.net/pb/german/manual/date/hour.html
Debug Hour(Date(0, 0, 0, 11, 3, 45)) ; gibt '11' aus.
http://www.purearea.net/pb/german/manua ... inute.html
Debug Day(Date(0, 0, 0, 11, 3, 45)) ; gibt '3' aus.
http://www.purearea.net/pb/german/manua ... econd.html
Debug Second(Date(0, 0, 0, 11, 3, 45)) ; gibt '45' aus.
War auch in PB 3.72 nicht i.O.

Code: Alles auswählen

Debug Hour(Date(0, 0, 0, 11, 3, 45))  ; gibt '11' aus
Debug Day(Date(0, 0, 0, 11, 3, 45))   ; gibt '3' aus
Debug Second(Date(0, 0, 0, 11, 3, 45))  ; gibt '45' aus
Debug-Ergebnis hat geschrieben:0
0
0
[Edit] Das Korrekte Datum ab 1970 muß man schon einsetzten und
2035 oder ein paar Jahre weiter gibts wieder Fehler. Aber das macht
nix, dann bin ich ja schon auf Rente. :bounce:

Code: Alles auswählen

Debug "Das geht nur, wenn man das korrekte Datum zwischen 1970-2034"
Debug "und Tage und Monate grösser '0' einsetzt"
Debug "-------------------------------------------------------------------------------------------"
Debug "   Hour(Date(1970,1,1, 11, 3, 45)); gibt '"+Str(Hour(Date(1970,1,1, 11, 3, 45)))+"'  aus"
Debug "Minute(Date(1970,1,1, 11, 3, 45)); gibt '"+Str(Minute(Date(1970,1,1, 11, 3, 45)))+"'  aus"
Debug "Second(Date(1970,1,1, 11, 3, 45)); gibt '"+Str(Second(Date(1970,1,1, 11, 3, 45)))+"'  aus"
Debug""
Debug ""
Debug "Und jetzt die fehlerhafte Ausgabe"
Debug "-------------------------------------------------------------------------------------------"
Debug "   Hour(Date(1969,1,1, 11, 3, 45)); gibt '"+Str(Hour(Date(1969,1,1, 11, 3, 45)))+"'  aus"
Debug "Minute(Date(1969,1,1, 11, 3, 45)); gibt '"+Str(Minute(Date(1969,1,1, 11, 3, 45)))+"'  aus"
Debug "Second(Date(1969,1,1, 11, 3, 45)); gibt '"+Str(Second(Date(1969,1,1, 11, 3, 45)))+"'  aus"
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Was die Hilfe angeht, werde ich dies nochmal überprüfen.
Bzgl. Funktionsweise nochmal Fred fragen, der Bug mit Werten unter 1 Stnude wurde bereits gemeldet.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
wichtel
Beiträge: 150
Registriert: 09.09.2004 08:35
Wohnort: Hattersheim

Beitrag von wichtel »

@FALCO
Das mit dem Ende bei 2035 ist ein Problem für viele UNIX und andere Systeme und Steuerungen die die "sekunden sein Unix" Datums Methode nutzen. Ein neues "Jahr2000" Problem also. Liegt auch wieder an einem Integer Überlauf...
Aber wie du sagtest, bis dahin Rente....
(Selbst bei der aktuellen Wirtschaftslage) :D

EDIT:
genau bei: 2038, 03:14
(also auf jeden Fall nach der Rente)

2147483647
1111111111111111111111111111111

signed 32bit Grenze
PB / jaPBe jeweils aktuellste Version, seit 3.62 dabei, XP sp3 de/en & W7 en
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

wichtel hat geschrieben:Liegt auch wieder an einem Integer Überlauf...
Aber wie du sagtest, bis dahin Rente....
(Selbst bei der aktuellen Wirtschaftslage) :D
PB soll ja mit v4.0 64bit-Typen (longlong/quads) unterstützen,
und dann könnte man solche Funktionen ändern, so daß sie
64bit-Werte zurückgeben. Genauso bei Funktionen wie Lof().

Nur noch ein paar Monate warten... PB 4.0 ist auf jeden Fall
noch für 2005 *geplant*.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten