Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kalenderwochenberechnung USA (https://www.delphipraxis.net/134600-kalenderwochenberechnung-usa.html)

sirarcher 25. Mai 2009 15:53


Kalenderwochenberechnung USA
 
Hi Leute,

irgendwie stelle ich mich heute zu blöd an, daher hoffe ich das mir einer von euch helfen kann.

Ich weiß das ich zB. mit der JclDateTime -> Funktion "ISOWeekNumber" oder

mit "WeekOfTheYear"

die Kalenderwoche berechnen kann. Und zwar die ISO 8601 gültige.

Ich würde jedoch die Amerikanische benötigen. (Wochenbegin Sonntag, Erste Sonntag = KW 1)

In VB geht dies mit KW = Format(Datum, "ww", VbSunday, VbFirstJan1)

Weiß jemand wie ich dies in Delphi bewerkstellige?

Danke für jede Hilfe!


PS: Als Beispieldaten:

01.01.1994 --> SA --> EU (KW 52)
01.01.1994 --> SA --> USA (KW 52)

01.02.1994 --> SO --> EU (KW 52)
01.02.1994 --> SO --> USA (KW 1)

DeddyH 25. Mai 2009 16:20

Re: Kalenderwochenberechnung USA
 
Ohne groß geprüft zu haben: http://delphi.about.com/cs/adptips20...ltip0300_2.htm

sirarcher 26. Mai 2009 07:00

Re: Kalenderwochenberechnung USA
 
Hi,

danke für den Tipp, jedoch ist die Berechnung dort "falsch". Sie liefert mir beim Prüfen von den zwei Testdati leider jedesmal die KW 1 zurück. Müsste 1x KW52 und 1x KW1 bei "US" zurückliefern.

Trotzdem Danke! Vielleicht weiß noch jemand was? Werde auf jedenfall weiter suchen bzw. grübeln, vielleicht stehe ich ja heute nicht auf der "Leitung" :( ...

HeinzJ 26. Mai 2009 07:35

Re: Kalenderwochenberechnung USA
 
Hat mir bei ähnlichem geholfen: http://www.merlyn.demon.co.uk/weekinfo.htm

sirarcher 26. Mai 2009 08:40

Re: Kalenderwochenberechnung USA
 
Hi,

danke für eure Hilfe. (bzw. die Links)

Habe es nun so glaube ich gelöst:

Delphi-Quellcode:
function GetWeekNumberUS(const aDateTime: TDateTime): string;
var
  Y,M,D:Word;
  dtTmp:TDateTime;
  dtLastYear: TDateTime;
  strTempResult: string;
begin
  DecodeDate(aDateTime,Y,M,D) ;
  dtTmp := EnCodeDate(Y,1,1) ;
  strTempResult := IntToStr((Trunc(aDateTime-dtTmp)+(DayOfWeek(dtTmp)-1)) DIV 7);
  //Wenn Result = 0 dann ist es die letzte Kalenderwoche vom "Vorjahr".
  if strTempResult = '0' then begin
    //Jahr um 1 verringern, da man im "letzten" Jahr die letzte Woche ermitteln muss.
    Y := Y - 1;
    //31.12 vom Vorjahr ermitteln
    dtLastYear := EnCodeDate(Y,12,31) ;
    //1.1. vom Vorjahr ermitteln
    dtTmp := EnCodeDate(Y,1,1) ;
    //KW Berechnung
    strTempResult := IntToStr((Trunc(dtLastYear-dtTmp)+(DayOfWeek(dtTmp)-1)) DIV 7);
  end;
  //Result ist genau die Kalenderwoche
  Result := strTempResult;

  //Oder wenn man will mit Jahreszahl formatiert
  if StrToInt(strTempResult) < 10 then strTempResult := '0' + strTempResult;
  Result := FormatDateTime('yyyy',dtTmp) + 'W' + strTempResult;
end;
Nochmals DANKE! Grüße

Wolfgang Mix 26. Mai 2009 20:10

Re: Kalenderwochenberechnung USA
 
Nach gibt es eine 53. Kw immer dann, wenn der 1.1.d.J. oder der 31.12.d.J. auf einen Donnerstag fallen.
Wie ist das beim US-Kalender?

Jürgen Thomas 27. Mai 2009 08:14

Re: Kalenderwochenberechnung USA
 
Hallo sirarcher,

ich empfehle dringend, die Variable strTempResult und den Rückgabewert als int zu behandeln (das erspart auch einige IntToStr-Umwandlungen). Du willst eine Zahl bestimmen, dann arbeite doch auch damit (und nur damit). In den Fällen, in denen du wirklich einen String brauchst, kannst du an der betreffenden Stelle umwandeln; das ist eine Frage der konkreten Anforderung, aber nicht eine Frage der Berechnung.

Wenn du das häufiger brauchst, dann empfiehlt sich eher eine Variante GetWeekNumberUSAsString, die nur die beiden Formatierungen vornimmt und die Berechnung in function GetWeekNumberUS(): int; belässt.

Gruß Jürgen


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