Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Jahre mit 53 Wochen (https://www.delphipraxis.net/140513-jahre-mit-53-wochen.html)

Wolfgang Mix 19. Sep 2009 16:27


Jahre mit 53 Wochen
 
Jahre mit 53 Wochen

Aktualisierte Fassung hier hier


gibt es immer dann, wenn der 1.1. oder der 31.12. des Jahres auf einen Donnerstag fallen.

Zur Verwendung habe ich 2 Routinen geschrieben, Is53Weeks1 und Is53Weeks2.
Die erste ist plattformunabhängig, die zweite benötigt Delphi.

Delphi-Quellcode:
implementation

{$R *.dfm}

//Wolfgang Mix - Delphi-Praxis
//ISO-Standard 8601
function Is53weeks1(y:word):boolean;
var date1,date2:TDate;
begin
  date1:=EncodeDate(y,1,1);
  date2:=EncodeDate(y,12,31);
  if (DayOfTheWeek(date1)=4) or (DayOfTheWeek(date2)=4) then
  result:=true else result:=false;
end;

//Wolfgang Mix - Delphi-Praxis
//ISO-Standard 8601
function Is53weeks2(y:word):boolean;
var date:TDate;
begin
  date:=EncodeDate(y,1,1);// must be
  If(WeeksInYear(date)=53) then result:=true else result:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var year:integer;
begin
  Edit1.Text:=BoolToStr(Is53Weeks1(2009));
end;

end.
Gruß

Wolfgang

mirage228 19. Sep 2009 16:50

Re: Jahre mit 53 Wochen
 
Die Funktionen lassen sich auch etwas kompakter darstellen :)

Delphi-Quellcode:
function Is53weeks1(y: word): boolean;
begin
  Result := (DayOfTheWeek(EncodeDate(y, 1 , 1)) = 4) or (DayOfTheWeek(EncodeDate(y, 12, 31)) = 4);
end;

function Is53weeks2(y: word): boolean;
begin
  Result := (WeeksInYear(EncodeDate(y,1,1)) = 53);
end;
Vorteil besonders bei ersterem ist, dass EncodeDate im zweiten Teil des OR gar nicht erst aufgerufen wird, falls der erste schon zum Ergebnis führt :)

Viele Grüße

Wolfgang Mix 19. Sep 2009 16:56

Re: Jahre mit 53 Wochen
 
Danke, einverstanden, es gibt immer noch etwas zum Verbessern,
deswegen sind wir ja in der DP :-)

Gruß

Wolfgang

DeddyH 19. Sep 2009 16:58

Re: Jahre mit 53 Wochen
 
Zitat:

Zitat von mirage228
Vorteil besonders bei ersterem ist, dass EncodeDate im zweiten Teil des OR gar nicht erst aufgerufen wird, falls der erste schon zum Ergebnis führt :)

Es sei denn, man hat die vollständige Prüfung aktiviert ;)

Wolfgang Mix 19. Sep 2009 17:00

Re: Jahre mit 53 Wochen
 
:-D

Wolfgang Mix 19. Sep 2009 22:46

Re: Jahre mit 53 Wochen
 
Ich belasse es trotzdem bei meiner 1. Version, damit auch Beginner eine Chance haben,
den Code zu verstehen. (Kommt wieder der Pauker in mir durch)

Gruß

Wolfgang

rollstuhlfahrer 20. Sep 2009 08:14

Re: Jahre mit 53 Wochen
 
änderst du dann auch deinen wohl offensichtlich fehlerbehafteten Quellcode der Version 1 ab, sodass die Logik dahinter wieder stimmt? Wenn du diesen Vergleich wie in Version 1 machst, dann hast du im Deutschen ja ein UND zwischen den beiden Vergleichsoperatoren. Wieso wird dann aus dem UND ein ODER im Englischen (siehe Post 2)?

Bernhard

hoika 20. Sep 2009 08:59

Re: Jahre mit 53 Wochen
 
Hallo,

Delphi-Quellcode:
DayOfTheWeek(date1)=4
Das würde ich als Anfänger nicht verstehen ...

const DoW_XXX = 4; // XXX darf der Coder noch festlegen ;)

...

Delphi-Quellcode:
DayOfTheWeek(date1)=DoW_XXX

Heiko

DeddyH 20. Sep 2009 10:07

Re: Jahre mit 53 Wochen
 
Da gab es doch bereits DayThursday etc., oder irre ich mich?

Wolfgang Mix 20. Sep 2009 10:16

Re: Jahre mit 53 Wochen
 
Das war z.B. der letzte Donnerstag eines Monats aus meinen Dateutils.

Grüß

Wolfgang

DeddyH 20. Sep 2009 10:19

Re: Jahre mit 53 Wochen
 
Ja, mir ging es ja nur darum, dass man die Konstanten für die Wochentage nicht unbedingt neu definieren muss (aber natürlich kann), da diese doch bereits in DateUtils definiert sind. Aber Heiko hat schon recht, mit sprechenden Konstanten ist der Code für Außenstehende einfacher zu verstehen.

hoika 20. Sep 2009 12:52

Re: Jahre mit 53 Wochen
 
Hallo,

jepp, das meinte ich.
Der Anfänger weiss z.B. nicht, dass die Wochentage
mit Sonntag als 0 definiert seind.


*erstmal grillen* ;)


Heiko

Wolfgang Mix 20. Sep 2009 14:00

Re: Jahre mit 53 Wochen
 
@hoika

Zitat aus Post #1:

Zitat:

Jahre mit 53 Wochen

gibt es immer dann, wenn der 1.1. oder der 31.12. des Jahres auf einen Donnerstag fallen.
weiteres Zitat aus Post #1:

Zitat:

Result := (DayOfTheWeek(EncodeDate(y, 1 , 1)) = 4) (DayOfTheWeek(date2)=4) then ...
Wer ein bißchen den Quelltext liest und Finger zum Zählen hat,
der kommt sehr schnell darauf, daß die Zählung bei WeekOfTheYear
bei Montag = 1 beginnt

Gruß und guten Appetit :wall:

Wolfgang

DeddyH 20. Sep 2009 15:33

Re: Jahre mit 53 Wochen
 
Hallo Wolfgang,

reg Dich doch nicht auf, es sollte ja keine Kritik sein. Nur wenn diese Funktion irgendwann einmal ohne den zugehörigen Kommentar zitiert wird, ist es doch zugegebenermaßen einfacher zu verstehen, dass der Donnerstag der Casus Knacktus ist, wenn eine sprechende Konstante verwendet wird, meinst Du nicht auch? Es macht den Code ja nicht schlechter, sondern nur schneller nachvollziehbar.

Wolfgang Mix 20. Sep 2009 15:44

Re: Jahre mit 53 Wochen
 
Ich rege mich nicht auf. ;-)
Wollte nur klarmachen, daß DayOfTheWeek definitiv mit Montag = 1 startet.
War wohl mit DayOfWeek verwechselt worden.

Gruß

Wolfgang

DeddyH 20. Sep 2009 15:45

Re: Jahre mit 53 Wochen
 
Gerade wegen dieser Verwechslungsgefahr bietet es sich doch an, die 4 gegen DayThursday oder eine selbst definierte Konstante auszutauschen, oder? :zwinker:

Wolfgang Mix 20. Sep 2009 16:01

Re: Jahre mit 53 Wochen
 
Einverstanden :-D
Gruß

Wolfgang

DeddyH 20. Sep 2009 16:08

Re: Jahre mit 53 Wochen
 
Schön, dass wir einmal drüber gesprochen haben :lol: :cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz