Rechnen mit Datum in [BMax] [BB] [B3D]

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Midimaster

Betreff: Rechnen mit Datum in [BMax] [BB] [B3D]

BeitragDi, März 16, 2010 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier eine sehr schlanke Funktion, um ein Datum wie einen Integer-Wert behandeln zu können. Damit ist es sehr leicht möglich im Kalender zu rechnen.


Der Code besteht aus 3 Funktionen

BlitzMax: [AUSKLAPPEN]
TimeStamp%(Datum$)
...rechnet beliebiges Datum in einen Integer-Wert um. Der Wert entspricht der Anzahl der Tage seit 4.1.0000

BlitzMax: [AUSKLAPPEN]
MakeDate$(TimeStamp%) 
...rechnet den Integer-Wert in ein Datum zurück. Zurückgegebenes Format : DD.MM.JJJJ

Mit den beiden Funktion ist es möglich, Tage zu Datum-Strings zu addieren. Die Funktionen arbeiten mit allen Datum-Angaben ab dem Jahr "100 n Chr"

Beispiele:

Wieviele Tage liegen zwischen Weihnachten und Valentinstag?
BlitzMax: [AUSKLAPPEN]
Print TimeStamp("14.2.10") - TimeStamp("24.12.09") )


Welches Datum war 100 Tage nach dem 1.Aug.1567?
BlitzMax: [AUSKLAPPEN]
Print MakeDate( TimeStamp("1 Aug 1567") + 100 )


Welches Datum war heute vor 60 Tagen?
BlitzMax: [AUSKLAPPEN]
Print MakeDate( TimeStamp(CurrentDate()) - 60 )


Welcher Wochentag ist heute (Mo=0, Di=1,...)?
BlitzMax: [AUSKLAPPEN]
Print( TimeStamp(CurrentDate()) Mod 7 )





Timestamp akzeptiert dabei mehrere Datumsformate:
Trennzeichen kann <.> </> oder <SPACE> sein:
Zitat:
" 23.12.2067"
"14 aug 68"
"26/12/1788"

aber die Reihenfolge immer D->M->J

Die Werte werden ein oder zweistellig akzeptiert
Zitat:
1.1.2010
01.1.2010
1.01.2010
1.1.10



Das Jahr wird auch zweistellig akzeptiert, dann als Zeitraum zwischen 1950 und 2049 interpretiert:
Zitat:
"1" bis "49" -> "2001" bis "2049"
"50" bis "99" -> "1950" bis "1999"


Der Monat wird als Zahl oder Wort in english oder deutsch jeweils auch als Abkürzung akzeptiert:
Zitat:
"1/1/10"
"1.Jan.10"
"1 Januar 2010"




Die Funktion
BlitzMax: [AUSKLAPPEN]
 ReformDate$(Date$) 

....wird intern benötigt, kann aber auch benutzt werden, ein Datum in die Form DD.MM.JJJJ zu bringen:

Zitat:
"1 Jan 10" -> "01.01.2010"


BlitzMax: [AUSKLAPPEN]
;'SuperStrict
;' TimeStamp V 1.01 16.03.2010 13:57 Autor: Midimaster
;' läuft unter Bmax, BB, B3D
;'
;' TimeStamp%(Datum)
;' ...rechnet beliebiges Datum in einen Integer-Wert um
;' Der Wert entspricht der Anzahl der Tage seit 1.1.0000

;' MakeDate$(TimeStamp%)
;' ...rechnet IntegerWert in Datum um
;' zurückgegebenes Format : DD.MM.JJJJ
;'

;' Mit den beiden Funktion ist es möglich, Tage zu Datum-Strings zu addieren
;' Die Funktionen arbeiten mit allen Datum-Angaben ab dem Jahr "100 n Chr"

Print MakeDate( TimeStamp("1 Aug 1567") + 100 )




;' Timestamp akzeptiert dabei mehrere Datumsformate:
;' Trennzeichen kann <.> </> oder <SPACE> sein:
;' " 23.12.2067" "14 aug 68" "26/12/1788" aber die Reihenfolge immer D->M->J
;' Die Werte werden ein oder zweistellig akzeptiert
;' 1.1.2010 01.1.2010 1.01.2010. 1.1.10
;' Das Jahr wird auch zweistellig akzeptiert:
;' "1" bis "49" -> "2001" bis "2049" "50" bis "99" -> "1950" bis "1999"
;' Der Monat wird als Zahl oder Wort in english oder deutsch akzeptiert:
;' "1/1/10" "1.Jan.10" "1 Januar 2010"


;' ReformDate$(Date$)
;' ....wird intern benötigt, kann aber auch benutzt werden,
;' ein Datum in die Form DD.MM.JJJJ zu bringen
;' "1 Jan 10" -> "10.10.2010"



Function TimeStamp%(Date$)
Local locStamp%, Year%, locZ%, Month%, Day%
locStamp=0
date=ReformDate(Date)
Year=Int(Mid(Date,7,4))
locZ%= 0
Repeat
If locZ+400>Year Then Exit
locStamp=locStamp + 146097
locZ=locZ+400
Forever
Repeat
If locZ+1>Year Then Exit
locStamp=locStamp + 365 + LeapYear(locZ)
locZ=locZ+1
Forever

locZ%=1
Month=Int(Mid(Date,4,2))
Repeat
If locZ+1>Month Then Exit
locStamp=locStamp + GetDays(locZ,year)
locZ=locZ+1
Forever

Day=Int(Mid(Date,1,2))
locStamp = locStamp + Day-3 ;' wegen Montags=0
Return locStamp

End Function




Function MakeDate$(TimeStamp%)
Local locStamp%, Year%, Month%,Day%, Tage%
TimeStamp=TimeStamp-1+3
Repeat
Tage%= 146097
If locStamp+Tage>TimeStamp Then Exit
Year=year+400
locStamp = locStamp+Tage
Forever
Repeat
Tage%= 365+LeapYear(year)
If locStamp+Tage>TimeStamp Then Exit
Year=year+1
locStamp = locStamp+Tage
Forever

For month=1 To 12
Tage%=GetDays (month,year)
If locStamp+ Tage > timeStamp Then Exit
locStamp = locStamp + tage
Next
If month=13 Then Return "31.12."+year
Day= 1-locStamp+timeStamp
Return Right("00"+Day,2)+"." + Right("00"+Month,2) + "." + Year
End Function





Function ReformDate$(Date$)
Local Month$, Da%, Day$,Year$, Sign$
If Instr(Date,".") Then
Sign="."
ElseIf Instr(Date,"/") Then
Sign="/"
ElseIf Instr(Date," ") Then
Sign=" "
EndIf
Da=Instr(Date,Sign)
If Da>0 Then
Day=Right("00" + Left(Date,Da%-1),2)
Month=Mid(date,da+1,-1)
Da=Instr(Month,Sign)
If Da>0 Then
Year=Mid(Month,Da+1,-1)
If Len(Year)<3 Then
If Int(Year)<50 Then
Year="20" + Year
Else
Year="19" + Year
EndIf
EndIf
Month=Left(Month,da-1)
EndIf
EndIf
If Int(Month)>0 Then
Month=Right("00" + month,2)
Else
Select Lower(month$)
Case "jan","januar","january"
Month = "01"
Case "feb","februar","february"
Month = "02"
Case "mar","märz","march","mrz"
Month = "03"
Case "apr","april"
Month = "04"
Case "mai","may"
Month = "05"
Case "jun","juni","june"
Month = "06"
Case "jul","juli","july"
Month = "07"
Case "aug","august"
Month = "08"
Case "sep","september"
Month = "09"
Case "okt","oct","oktober","october"
Month = "10"
Case "nov","november"
Month = "11"
Case "dez","dec","dezember","december"
Month = "12"
Default
Month = "00"
End Select
EndIf
Return Day + "." + Month + "." + Year
End Function



Function LeapYear%(year%)
If year Mod 400 = 0 Then Return 1
If year Mod 4 = 0 And year Mod 100 <> 0 Then Return 1
Return 0
End Function




Function GetDays%(month%,year%)
Select Month
Case 1,3,5,7,8,10,12
Return 31
Case 4,6,9,11
Return 30
Case 2
Return 28+LeapYear(year)
End Select
End Function




  • Zuletzt bearbeitet von Midimaster am Do, März 18, 2010 20:56, insgesamt 6-mal bearbeitet

skey-z

BeitragDi, März 16, 2010 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
"1 Jan 10" -> "10.10.2010"


Wenn dein Interpreter das ausgepuckt hat, solltest du ihn noch mal überarbeiten Wink
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

Midimaster

BeitragDi, März 16, 2010 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo skey-z

also bei mir kommt auf...

BlitzMax: [AUSKLAPPEN]
Print ReformDate$("1 Jan 10")


als Ergebnis ein korrektes:

Zitat:
01.01.2010


Bitte schreib mir dringend, wie die Simulation dieses Fehlers gelingt, damit ich es gleich ändern kann!!!

Ah ,jetzt seh ich es:

Du meinst nur den Tippfehler im Posting! Der Code arbeitet also einwandfrei!



[EDIT]
auf Version 1.01 verbessert (am 16.03.2010 13:57)

Datums jetzt ab Basiswert "4.1.0000" statt "1.1.0000", so ergeben sich aus TimeStamp() Mod 7 immer die Wochentage Mo=0, Di=1,...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group