Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kalenderwoche Verständisproblem (https://www.delphipraxis.net/128656-kalenderwoche-verstaendisproblem.html)

Xzeer 3. Feb 2009 15:38


Kalenderwoche Verständisproblem
 
Hallo,

Ich möchte mir eine Funktion schreiben, der man ein Datum übergibt und die die zugehörige Kalenderwoche ermittelt. Dabei möchte ich alles frei schreiben, also nicht auf irgendwelche Delphi Objekte zurückgreifen.

Gefunden habe ich zuerst diese Version:

Zitat:

Kalenderwoche = (TagDesJahres / 7) + 1;
if Kalenderwoche = 53 then Kalenderwoch := 1;
Zum berechnen der Variablen TagDesJahres benutze ich folgenden Code (Java):

Zitat:

public int berechneTagImJahr(int jahr, int monat, int tag){
int lmon = (monat +10) / 13;
return ((3055 * (monat + 2)) / 100 - 2 * lmon - 91 + (1 - (jahr - (jahr / 4) * 4 + 3) / 4 + (jahr - (jahr / 100) * 100 + 99) / 100 - (jahr - (jahr /400) * 400 + 399) / 400) * lmon + tag);
Diese Function ist von meinem Info Lehrerund funktioniert auch.

Wenn ich allerdings versuche die Kalenderwoche zu ermitteln kommt für z.b das heutige Datum KW 5 heraus. Das ist ja falsch.

Dann habe ich noch diese Version ausprobiert (Java):

Zitat:

public int berechneKalenderwoche(int jahr, int monat, int tag){
double a = Math.floor((14 - monat) / 120);
double y = jahr + 4800 - a;
double m = monat + (12 * a) - 3;
double jd = tag + Math.floor(((153 * m) + 2) / 5) + (365 * y) + Math.floor(y / 4) - Math.floor(y / 100) + Math.floor(y / 400) - 32045;
double d4 = (jd + 31741 - (jd % 7)) % 146097 % 36524 % 1461;
double L = Math.floor(d4 / 1460);
double d1 = ((d4 - L) % 365) + L;
return (int) Math.floor(d1 / 7) + 1;
}
Allerdings der gleiche Fehler...

Kann mir vielleicht jemand erklären, wie man die KW richtig ausrechnet?

Sherlock 3. Feb 2009 15:42

Re: Kalenderwoche Verständisproblem
 
http://www.salesianer.de/util/kalwoch.html

Google Suchwörter: Kalenderwoche Definition

Edith zeigt noch diese ausführlichere Erklärung, die aber natürlich zum gleichen Ziel führt: http://de.wikipedia.org/wiki/Kalende...#Kalenderwoche

Sherlock

Xzeer 3. Feb 2009 15:53

Re: Kalenderwoche Verständisproblem
 
Danke für den Link. Den hatte ich schonmal gefunden, allerdings versteht ich nicht was genau ich machen muss.

Verständisprobleme habe ich bei der Funktion eptage. Wie soll ich denn die vergangenen Tage der Zeitrechnung rausbekommen?

Odre ist damit 2008*365+34 gemeint? :gruebel:

Sherlock 3. Feb 2009 16:01

Re: Kalenderwoche Verständisproblem
 
Also auf Nummer sicher kannst Du da mit DateUtils.DaysBetween gehen. Nimmst einfach die Differenz zwischen 0 und dem gewünschten Datum.

Sherlock

tomsson74 3. Feb 2009 16:31

Re: Kalenderwoche Verständisproblem
 
Evtl. hilft Dir das weiter:

Delphi-Quellcode:
function DateToWeek(Datum:TDateTime; var Year:Word):Word;
var
Y,M,D : Word;
FDay : Word;
Days : Integer;
JanF : TDateTime;
begin
  try
    DecodeDate(Datum,Y,M,D);
    Year:=Y;
    JanF:=EncodeDate(Y,1,1);
    FDay:=DayOfWeek(JanF);
    Days:=Trunc(Int(Datum)-JanF)+(7-DayOfWeek(Datum-1))+(7*ord(FDay in [2..5]));
    Result:=Days div 7;
    if Result=0 then begin
      if (DayOfWeek(EncodeDate(Y-1,1,1))>5) or (DayOfWeek(EncodeDate(y-1,12,31))<5) then
        Result:=52
      else
        Result:=53;
      Year:=Y-1;
    end else
      if Result=53 then begin
        if (FDay>5) or (DayOfWeek(EncodeDate(Y,12,31))<5) then begin
          Result:=1;
          Year:=Y+1;
        end;
      end;
  except
    Result:=0;
  end;
end;

Der Jan 3. Feb 2009 16:37

Re: Kalenderwoche Verständisproblem
 
Hallo,

die Berechnung der deutschen KW erfolgt nach DIN 1355.

Hier gibts eine Funktion, ist zwar C, aber leicht verständlich.

omata 3. Feb 2009 16:41

Re: Kalenderwoche Verständisproblem
 
Hier noch ein weiterer Vorschlag...
Delphi-Quellcode:
function wochentag_nummer(tag, monat:byte; jahr:word):byte;
var year, century:word;
begin
  if monat > 2 then
    dec(monat, 2)
  else begin
    inc(monat, 10);
    dec(jahr);
  end;
  year:=jahr mod 100;
  century:=jahr div 100;
  Result:=(tag + (13*monat-1) div 5
           + year
           + year div 4
           + century div 4
           + 5 * century) mod 7;
  if Result = 0 then
    Result:=7;
end;

function schaltjahr(jahr:word):boolean;
begin
  Result:=(jahr mod 4 = 0) and (jahr mod 100 <> 0) or (jahr mod 400 = 0);
end;

function tag_im_jahr(tag, monat:byte; jahr:word):word;
var tage, i:word;
begin
  tage:=0;
  for i:=1 to monat-1 do begin
    case i of
      1,3,5,7,8,10,12: inc(tage,31);
                    2: if schaltjahr(jahr) then
                         inc(tage, 29)
                       else
                         inc(tage, 28);
             4,6,9,11: inc(tage,30)
    end
  end;
  Result:=tage + tag;
end;

function kalenderwoche(tag, monat:byte; jahr:word):byte;
var wtag, neujahr, silvester:byte;
    kw, tage:integer;
begin
  wtag:=wochentag_nummer(1, 1, jahr);
  if wtag <= 4 then
    kw:=0
  else
    kw:=-1;
  tage:=0 - (wtag - 1);
  repeat
    inc(kw);
    inc(tage, 7)
  until tage >= tag_im_jahr(tag, monat, jahr);

  if kw = 0 then begin
    dec(jahr);
    neujahr:=wochentag_nummer(1, 1, jahr);
    silvester:=wochentag_nummer(31, 12, jahr);
    if (neujahr = 4) or (silvester = 4) then
      kw:=53
    else
      kw:=52;
  end
  else begin
    if kw = 53 then begin
      silvester:=wochentag_nummer(31, 12, jahr);
      if silvester < 4 then
        kw:=1;
    end;
  end;
  Result:=kw;
end;

Der Jan 3. Feb 2009 17:16

Re: Kalenderwoche Verständisproblem
 
@Omata: Auch wenn es - wahrscheinlich - keiner von uns erleben wird, daher nur als Information, durch 3200 teilbare Jahre sind wiederum keine Schaltjahre. Diese Anpassung wurde irgendwann im 20.Jh. vorgenommen von einem Herren namens Heiss (glaub ich). Allerdings weiss ich nicht, ob das schon seinen Einzug in DIN, ISO etc. gefunden hat oder je wird...

globetrotter77 4. Feb 2009 00:07

Re: Kalenderwoche Verständisproblem
 
stimmt, da gab es was mit den 3200 Jahren!
aber viel wichtiger wär es, sich mal zu überlegen, ab wann diese Berechnung stimmt und wo sie gilt? :-D

Jürgen Thomas 4. Feb 2009 09:11

Re: Kalenderwoche Verständisproblem
 
Zitat:

Zitat von globetrotter77
stimmt, da gab es was mit den 3200 Jahren!
aber viel wichtiger wär es, sich mal zu überlegen, ab wann diese Berechnung stimmt und wo sie gilt? :-D

Da wir mit dem Gregorianischen Kalender arbeiten, unsere Zeitrechnung mit dem Jahr 1 beginnt und dieser Kalender im Jahre 1582 eingeführt wurde, ist das erste danach gültige Schaltjahr das Jahr 3200 n.Chr. Einzelheiten siehe Wikipedia: Tropisches Jahr. Danach könnte das Jahr 3200 das einzige sein, das in dieser Weise als Schaltjahr gilt, während ansonsten der Gregorianische Kalender eine ausreichende Genauigkeit aufweist.

Gruß Jürgen


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:37 Uhr.
Seite 1 von 2  1 2      

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