Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi WeekofTheYear ? (https://www.delphipraxis.net/206122-weekoftheyear.html)

Delbor 20. Nov 2020 12:39

Delphi-Version: 10.4 Sydney

WeekofTheYear ?
 
Hi zusammen

Ich habe vor vielen Jahren einen Kalender programmiert und dachte mir, ich müsse den nur ein kleines bisschen Anpassen - aber Pustekuchen!! Statt nun die damaligen Strukturen umzubauen, schreib ich mir besser eine neue Prozedur, die sich aus Teilen aus DateUtils logisch - und wahrscheinlich mit weniger Code - aufbaut.
Und so begine ich, indem ich den Jahresbegin als TDateTime hole. Davon will ich nun auf die aktuelle Woche und deren begin zugreifen

Delphi-Quellcode:
procedure TCompletYear2Frame.VerticalMonths;
   var i,j,k,Nr,x,y,ZV : Integer; Jahr,Woche: Word;
   LToday : String;
   LYearDate, WoStart,Datum:TDateTime;
begin
   LYearDate := StartOfTheYear(Date);
   Nr := WeekOfTheYear(LYearDate);
   // WeekofTheYear gibt einen Integer für die Wochennummer(?) zurück, der in 'Nr' gespeichert wird.
   WoStart := StartOfTheWeek(NR);
   // So, wie ich die Help verstanden habe, gibt StartOfTheWeek das Anfangsdatum der abgefragten Woche zurück
   // WoStart müsste demnach das Start-Datum der Woche enthalten
   Showmessage('LYearDate := ' + DatetoStr(LYearDate) + sLineBreak +
               'WeekOfTheYear := ' + IntToStr(Nr) + sLineBreak +
               'WoStart := '+ DateToStr(WoStart));
end;

Und das kommt dabei heraus:
Zitat:

LYearDate := 01.01.2020
WeekOfTheYear := 1
WoStart := 25.12.1899
[OK]
Was, zum ..., mache ich falsch?

Gruss
Delbor

mkinzler 20. Nov 2020 12:46

AW: WeekofTheYear ?
 
WeekOfTheYear ist nicht eindeutig, da je nachdem, wo man sich befindet (Land) entweder die 1. Woche oder die Woche mit dem 1. Montag (bzw. 1 Tag der Woche) gemeint ist.

EDIT: Du Funktion ist schon eindeutig, ist aber u.U. nicht das gewünschte.

Durch Verwendung der 2. überladenen Variante kann man das Fehlverhalten aber erkenn und korrigieren.

Der schöne Günther 20. Nov 2020 12:46

AW: WeekofTheYear ?
 
Zitat:

Zitat von Delbor (Beitrag 1477640)
Was, zum ..., mache ich falsch?

StartOfTheWeek(..) erwartet ein TDateTime. Du steckst irgendeine Nummer rein die kein TDateTime ist.

http://docwiki.embarcadero.com/Libra...StartOfTheWeek
http://docwiki.embarcadero.com/Libra....WeekOfTheYear

Zitat:

Zitat von mkinzler (Beitrag 1477642)
WeekOfTheYear ist nicht eindeutig

WeekOfTheYear(..) orientiert sich, wie in der Doku beschrieben, an ISO8601 und nicht an länderspezifischen Regeln, ist also schon eindeutig.

Delphi.Narium 20. Nov 2020 13:06

AW: WeekofTheYear ?
 
Delphi-Quellcode:
   LYearDate := StartOfTheYear(Date); // => 01.01.2020
   Nr := WeekOfTheYear(LYearDate); // => 1 = 1. Woche des Jahres 2020
   WoStart := StartOfTheWeek(Nr); // => Start der Woche in den der 30.12.1899 fällt.
                                  // (TDateTime = 1 => 30.12.1899)
                                  // und diese Woche begann am 25.12.1899.
   // Probier es doch mal mit dem Beginn der Woche, in die der 01.01.2020 gefallen ist ;-)
   WoStart := StartOfTheWeek(LYearDate); // => Start der ersten Woche des Jahres 2020


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 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