entweder ist in meinen routinen ein fehler oder der fehler liegt bei PB. als variable für die sekunden verwende ich quad und bei werte grösser 2^47 gibt es programmaufhänger. ist jetzt nicht ganz so schlimm, weil mit 2^47 sekunden kommt man schon etwas weiter als 4 millionen jahre

die beiden proceduren mit ein paar beispielen:
Code: Alles auswählen
OpenConsole()
;
; Die date-Structure muss nicht unbedingt definiert werde, nur wenn man diese auch
; verwenden möchte.
Structure date
Jahr.l
Monat.l
Tag.l
Stunde.l
Minute.l
Sekunde.l
WTag.l
EndStructure
; #################################################################################
; DateToSek wandelt ein Datum in Sekunden seit dem 1.1.1600 0 Uhr um.
; Wenn das Datum mittels eines Pointers auf die Structure date übergeben wird,
; werden Date$ und Form$ ignoriert.
; Wird das Datum per Date$ übergeben, muss in Form$ die reihen der Daten übergeben werden.
; Z.B.: Date$="18.08.1968 um 12 Uhr 25" : Form$="%TT%MM%JJ%SS%MI"
; Angegeben werden kann:
; %JJ -> Jahr
; %MM -> den Monat
; %TT -> den Tag
; %SS -> die Stunden
; %MI -> Minuten
; %SE -> Sekunden
; Werden Stunden, Minuten und Sekunden nicht angegeben, werden sie auf 0 gesetzt.
;
Procedure.q DateToSek(Date$,Form$,*Date=0)
If *Date
Jahr=PeekL(*Date)
Monat=PeekL(*Date+4)
Tag=PeekL(*Date+8)
Stunde=PeekL(*Date+12)
Minute=PeekL(*Date+16)
Sekunde=PeekL(*Date+20)
Else
Stunde=0
Minute=0
Sekunde=0
*Str.Character=@Date$
Sp=0
p=-2
Repeat
p=FindString(Form$,"%",p+3)
If p=0 : Break : EndIf
a$=Mid(Form$,p+1,2)
While *Str\c<48 Or *Str\c>57 : If *Str\c=0 : Break 2 : EndIf : *Str+1 : Sp+1 : Wend
p1=Sp
While *Str\c>47 And *Str\c<58 : *Str+1 : Sp+1 : Wend
Value=Val(Mid(Date$,p1+1,Sp-p1))
Select a$
Case "JJ" : Jahr=Value : If Jahr<1600 : Jahr+2000 : EndIf
Case "MM" : Monat=Value
Case "TT" : Tag=Value
Case "SS" : Stunde=Value
Case "MI" : Minute=Value
Case "SE" : Sekunde=Value
EndSelect
ForEver
EndIf
Monat-1
Tag-1
If Jahr>1600
For i=1600 To Jahr-1 Step 4
If ( i%4=0 And Not i%100=0 ) Or i%400=0
SchaltTage+1
EndIf
Next i
EndIf
If (( Jahr%4=0 And Not Jahr%100=0 ) Or Jahr%400=0) And Monat>1
SchaltTagJetzt=1
Else
SchaltTagJetzt=0
EndIf
Jahr-1600
MTag=PeekW(?MonatsTage+(Monat*2))
Sek.q=Jahr*365
Sek=(Sek+SchaltTage+MTag+SchaltTagJetzt+Tag)*24
Sek=(Sek+Stunde)*60
Sek=(Sek+Minute)*60
Sek+Sekunde
ProcedureReturn Sek.q
DataSection
MonatsTage:
Data.w 0,31,59,90,120,151,181,212,243,273,304,334,365
EndDataSection
EndProcedure
; #################################################################################
; SekToDate wandelt Sekunden (ausgehen vom 1.1.1600 0 Uhr) zurück in ein Datum ähnlich der
; FormatDate() Function von PureBasic.
; Z.B.: SekToDate(11632854310,"%WTAG, den %TT.%MM.%JJJJ um %SS Uhr %MI und %SE Sekunden")
; wird "Sonntag, den 18.08.1968 um 12 Uhr 25 und 10 Sekunden" zurück geben.
; Wird zusätzlich ein Pointer auf eine date-Structure mit übergeben, wird das Datum dort
; gespeichert.
; In Form$ werden folgende Zeichen entsprechende Werte zurück liefern:"
; %JJJJ -> 4 stellige Jahreszahl, z.B. 1968
; %JJ -> 2 stellige Jahreszahl, z.B. 68
; %MM -> Monat als Zahl 2 stellig
; %MMM -> Monat als abgekürztes Wort, z.B.: Aug
; %MMMM -> Monat als Wort, z.B.: August
; %TT -> Tag als 2 stellige Zahl, z.B.: 18
; %WTAG -> Wochentag, z.B.: Sonntag
; %WT -> Wochentag abgekürzt, z.B.: So
; %SS -> Stunden 2 stellig
; %MI -> Minuten 2 stellig
; %SE -> Sekunden 2 stellig
;
Procedure.s SekToDate(Sek.q,Form$,*Date=0)
#TagSek=86400
#JahrSek=365*#TagSek
#SchaltJahrSek=#JahrSek+#TagSek
Days=Sek/#TagSek
Day=(Days+6)%7
Jahr=1600
Repeat
If (( Jahr%4=0 And Not Jahr%100=0 ) Or Jahr%400=0)
If Sek-#SchaltJahrSek>=0
Jahr+1
Sek-#SchaltJahrSek
Else
Break
EndIf
Else
If Sek-#JahrSek>=0
Jahr+1
Sek-#JahrSek
Else
Break
EndIf
EndIf
ForEver
If (( Jahr%4=0 And Not Jahr%100=0 ) Or Jahr%400=0)
SchaltJahr=1
Else
SchaltJahr=0
EndIf
Tage=Sek/#TagSek
Zeit=Sek%#TagSek
For i=1 To 12
MTag=PeekW(?MonatsTageII+(i*2))
If SchaltJahr And i>1 : MTag+1 : EndIf
If MTag>Tage : Break : EndIf
vorMTag=MTag
Next i
Monat=i
Tag=Tage-vorMTag+1
Stunde=Zeit/3600 : Zeit=Zeit%3600
Minute=Zeit/60 : Sekunde=Zeit%60
If *Date
PokeL(*Date,Jahr)
PokeL(*Date+4,Monat)
PokeL(*Date+8,Tag)
PokeL(*Date+12,Stunde)
PokeL(*Date+16,Minute)
PokeL(*Date+20,Sekunde)
PokeL(*Date+24,Day)
EndIf
If Len(Form$)>3
MonatNr=Monat-1
Form$=ReplaceString(Form$,"%JJJJ",StrQ(Jahr))
Form$=ReplaceString(Form$,"%JJ",Right(StrQ(Jahr),2))
Form$=ReplaceString(Form$,"%MMMM",PeekS(?MonatStrings+MonatNr*10))
Form$=ReplaceString(Form$,"%MMM",PeekS(?MonatStrings+MonatNr*10,3))
Form$=ReplaceString(Form$,"%MM",RSet(StrQ(Monat),2,"0"))
Form$=ReplaceString(Form$,"%TT",RSet(StrQ(Tag),2,"0"))
Form$=ReplaceString(Form$,"%WTAG",PeekS(?WTagStrings+Day*11))
Form$=ReplaceString(Form$,"%WT",PeekS(?WTagStrings+Day*11,2))
Form$=ReplaceString(Form$,"%SS",RSet(StrQ(Stunde),2,"0"))
Form$=ReplaceString(Form$,"%MI",RSet(StrQ(Minute),2,"0"))
Form$=ReplaceString(Form$,"%SE",RSet(StrQ(Sekunde),2,"0"))
EndIf
ProcedureReturn Form$
DataSection
MonatsTageII:
Data.w 0,31,59,90,120,151,181,212,243,273,304,334,365
WTagStrings:
Data.c 'S','o','n','n','t','a','g',0,0,0,0,'M','o','n','t','a','g',0,0,0,0,0
Data.c 'D','i','e','n','s','t','a','g',0,0,0,'M','i','t','t','w','o','c','h',0,0,0
Data.c 'D','o','n','n','e','r','s','t','a','g',0,'F','r','e','i','t','a','g',0,0,0,0
Data.c 'S','a','m','s','t','a','g',0,0,0,0
MonatStrings:
Data.c 'J','a','n','u','a','r',0,0,0,0,'F','e','b','r','u','a','r',0,0,0
Data.c 'M','ä','r','z',0,0,0,0,0,0,'A','p','r','i','l',0,0,0,0,0
Data.c 'M','a','i',0,0,0,0,0,0,0,'J','u','n','i',0,0,0,0,0,0
Data.c 'J','u','l','i',0,0,0,0,0,0,'A','u','g','u','s','t',0,0,0,0
Data.c 'S','e','p','t','e','m','b','e','r',0,'O','k','t','o','b','e','r',0,0,0
Data.c 'N','o','v','e','m','b','e','r',0,0,'D','e','z','e','m','b','e','r',0,0
EndDataSection
EndProcedure
; #################################################################################
Sek.q=DateToSek(FormatDate("%dd.%mm.%yyyy %hh:%ii:%ss", Date()),"%TT%MM%JJ%SS%MI%SE")
;Sek.q=DateToSek("18.8.1968 12 Uhr 25 und 10 Sekunden","%TT%MM%JJ%SS%MI%SE")
PrintN("Jetziges Datum in Sekunden seit dem 01.01.1600 0 Uhr:")
PrintN(StrQ(Sek))
PrintN("")
PrintN("Und die Sekunden zurueck in ein lesbares Datum:")
PrintN(SekToDate(Sek,"%TT.%MM.%JJJJ %SS:%MI:%SE"))
PrintN("")
PrintN("oder mal anders ...")
PrintN(SekToDate(Sek,"%WTAG, den %TT. %MMMM %JJJJ um %SS Uhr %MI Minuten und %SE Sekunden",Datum.date))
PrintN("")
PrintN("Und das ganze noch bei bedarf aus der Structur date ausgelesen:")
PrintN("Jahr: "+StrQ(Datum\Jahr))
PrintN("Monat: "+StrQ(Datum\Monat))
PrintN("Tag: "+StrQ(Datum\Tag))
PrintN("Stunde: "+StrQ(Datum\Stunde))
PrintN("Minute: "+StrQ(Datum\Minute))
PrintN("Sekunde: "+StrQ(Datum\Sekunde))
PrintN("Wochentag: "+StrQ(Datum\WTag))
PrintN("")
PrintN("Uebergabe des Datums '18.08.1968 12:05:37' per Variable und Ausgabe aller moeglichen Formate ...")
Datum.date\Jahr=1968
Datum.date\Monat=8
Datum.date\Tag=18
Datum.date\Stunde=12
Datum.date\Minute=05
Datum.date\Sekunde=37
Sek.q=DateToSek("","",Datum.date)
Print("Jahreszahen: ")
PrintN(SekToDate(Sek,"%JJJJ und %JJ"))
Print("Monat: ")
PrintN(SekToDate(Sek,"%MM und %MMM und %MMMM"))
Print("Tag und Wochentag: ")
PrintN(SekToDate(Sek,"%WT oder %WTAG, den %TT."))
Print("Uhrzeit: ")
PrintN(SekToDate(Sek,"%SS Uhr %MI Minuten und %SE Sekunden"))
Input()
CloseConsole()