Seite 2 von 2
Re: DayOfWeek(Datum)
Verfasst: 28.01.2011 16:41
von NicknameFJ
DrFalo hat geschrieben:
Fehler oder sonstige Anmerkungen
Wenn ich das beim flüchtigen drüberlesen richtig sehe werden Tage ermittelt, mit 86400 multipliziert und anschließend beim ProcedureReturn wieder durch 86400 geteilt um wieder die Tage zu erhalten.
Die Multiplikation und Division könnte man sich wohl sparen - ungetestet.
Grüße
NicknameFJ
Re: DayOfWeek(Datum)
Verfasst: 28.01.2011 17:02
von rolaf
NicknameFJ hat geschrieben:DrFalo hat geschrieben:Fehler oder sonstige Anmerkungen
Die Multiplikation und Division könnte man sich wohl sparen - ungetestet.
Jawoll
Code: Alles auswählen
Procedure Wochentag(Datum.s)
Protected SchaltTag, ZeitWert.q
Protected Jahr = Val(StringField(Datum, 3, "."))
Protected Monat = Val(StringField(Datum, 2, "."))
Protected Tag = Val(StringField(Datum, 1, "."))
For A = 0 To Jahr - 1
If Not A % 400 Or (Not A % 4 And A % 100)
SchaltTag + 1
EndIf
Next A
ZeitWert = (Jahr - 1) * 365 + SchaltTag
For A = 1 To Monat - 1
Zeitwert + Val(StringField("31,28,31,30,31,30,31,31,30,31,30,31", A, ","))
Next A
If Monat > 2 Or (Monat = 2 And Tag = 29)
If Not Jahr % 400 Or (Not Jahr % 4 And Jahr % 100)
ZeitWert + 1
EndIf
EndIf
ZeitWert + (Tag - 1)
ProcedureReturn Zeitwert % 7
EndProcedure
Debug Wochentag("21.11.1964")
Habs inzwischen für die Teilung von über 4800 Ziehungen seit 1955 des Sa und Mi Lottos ausprobiert. Arbeitet einwandfrei...
Nur etwas mehr Geschwindigkeit dürfte noch sein.
P.S. Die dürfte in der ersten Schleife zu holen sein, in dem man nicht beim Jahr 0 anfängt sondern z.B. bei 1950 (in meinem Fall z.B.)...
Re: DayOfWeek(Datum)
Verfasst: 28.01.2011 17:19
von ts-soft
Vielleicht noch ein:
da rein, dann passt es

Re: DayOfWeek(Datum)
Verfasst: 28.01.2011 17:24
von NicknameFJ
DrFalo hat geschrieben:
P.S. Die dürfte in der ersten Schleife zu holen sein, in dem man nicht beim Jahr 0 anfängt sondern z.B. bei 1950 (in meinem Fall z.B.)...
Da nur alle 4 Jahre ein Schaltjahr sein kann, sollte auch in der ersten Schleife ein "Step 4" etwas zur Geschwindigkeit beitragen können.
Grüße
NicknameFJ
Re: DayOfWeek(Datum)
Verfasst: 28.01.2011 17:39
von rolaf
ts-soft hat geschrieben:Vielleicht noch ein:
da rein, dann passt es

Yes.
NicknameFJ hat geschrieben:DrFalo hat geschrieben:
P.S. Die dürfte in der ersten Schleife zu holen sein, in dem man nicht beim Jahr 0 anfängt sondern z.B. bei 1950 (in meinem Fall z.B.)...
Da nur alle 4 Jahre ein Schaltjahr sein kann, sollte auch in der ersten Schleife ein "Step 4" etwas zur Geschwindigkeit beitragen können.
Grüße
NicknameFJ
Auch Yes.
So wirds zur Rakete ab 1952
Code: Alles auswählen
Procedure Wochentag(Datum.s)
Protected SchaltTag, ZeitWert, A
Protected Jahr = Val(StringField(Datum, 3, "."))
Protected Monat = Val(StringField(Datum, 2, "."))
Protected Tag = Val(StringField(Datum, 1, "."))
For A = 1952 To Jahr - 1 Step 4
If Not A % 400 Or (Not A % 4 And A % 100)
SchaltTag + 1
EndIf
Next A
ZeitWert = (Jahr - 1) * 365 + SchaltTag
For A = 1 To Monat - 1
Zeitwert + Val(StringField("31,28,31,30,31,30,31,31,30,31,30,31", A, ","))
Next A
If Monat > 2 Or (Monat = 2 And Tag = 29)
If Not Jahr % 400 Or (Not Jahr % 4 And Jahr % 100)
ZeitWert + 1
EndIf
EndIf
ZeitWert + Tag - 1 + 4; +4 weil Start bei Jahr 1952 statt Jahr 0
ProcedureReturn Zeitwert % 7
EndProcedure
Debug Wochentag("21.11.1964")
Re: DayOfWeek(Datum)
Verfasst: 28.01.2011 18:13
von ts-soft
- 1 + 4 kann man aber vielleicht kürzen

Re: DayOfWeek(Datum)
Verfasst: 28.01.2011 18:26
von rolaf
ts-soft hat geschrieben:- 1 + 4 kann man aber vielleicht kürzen

Das war klar.
Ich habs nur so gelassen damit man versteht warum da 4 addiert werden, wegen des Wochentagsversatzes zwischen Jahr 0 und Jahr 1952.

Re: DayOfWeek(Datum)
Verfasst: 28.01.2011 18:35
von Kevin
hi,
Hier gibt es schon eine fertige include!
mfg
kevin
Re: DayOfWeek(Datum)
Verfasst: 31.01.2011 12:20
von Shardik
ts-soft hat geschrieben:- 1 + 4 kann man aber vielleicht kürzen

Kann man machen, aber muß man nicht...
Das macht nämlich der PB-Compiler sowieso:
PB-Compiler mit /COMMENTED-Schalter hat geschrieben:; ZeitWert + Tag - 1 + 4; +4 weil Start bei Jahr 1952 statt Jahr 0
MOV ebx,dword [esp+8]
ADD ebx,dword [esp+24]
ADD ebx,3
MOV dword [esp+8],ebx
Re: DayOfWeek(Datum)
Verfasst: 31.01.2011 12:32
von ts-soft
Ja, ja, ist schon traurig, wenn man sieht, das der Compiler intelligenter als der Programmierer ist
