DayOfWeek(Datum)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: DayOfWeek(Datum)

Beitrag 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
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: DayOfWeek(Datum)

Beitrag 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.)...
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: DayOfWeek(Datum)

Beitrag von ts-soft »

Vielleicht noch ein:

Code: Alles auswählen

Protected A
da rein, dann passt es :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

Re: DayOfWeek(Datum)

Beitrag 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
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: DayOfWeek(Datum)

Beitrag 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")
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: DayOfWeek(Datum)

Beitrag von ts-soft »

- 1 + 4 kann man aber vielleicht kürzen :lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: DayOfWeek(Datum)

Beitrag 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:
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

Re: DayOfWeek(Datum)

Beitrag von Kevin »

hi,

Hier gibt es schon eine fertige include!

mfg
kevin
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: DayOfWeek(Datum)

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: DayOfWeek(Datum)

Beitrag von ts-soft »

Ja, ja, ist schon traurig, wenn man sieht, das der Compiler intelligenter als der Programmierer ist :bounce:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten