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 :allright:

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. :mrgreen:

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:

Code: Alles auswählen

Protected A
da rein, dann passt es :wink:

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. :mrgreen:

Grüße

NicknameFJ

Re: DayOfWeek(Datum)

Verfasst: 28.01.2011 17:39
von rolaf
ts-soft hat geschrieben:Vielleicht noch ein:

Code: Alles auswählen

Protected A
da rein, dann passt es :wink:
Yes. :mrgreen:
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. :mrgreen:

Grüße

NicknameFJ
Auch Yes. :mrgreen:

So wirds zur Rakete ab 1952 :lol:

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 :lol:

Re: DayOfWeek(Datum)

Verfasst: 28.01.2011 18:26
von rolaf
ts-soft hat geschrieben:- 1 + 4 kann man aber vielleicht kürzen :lol:
Das war klar. :lol: :lol:
Ich habs nur so gelassen damit man versteht warum da 4 addiert werden, wegen des Wochentagsversatzes zwischen Jahr 0 und Jahr 1952. :wink:

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 :lol:
Kann man machen, aber muß man nicht... :mrgreen:

Das macht nämlich der PB-Compiler sowieso: :wink:
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 :bounce: