![]() |
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:
Zitat:
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:
Kann mir vielleicht jemand erklären, wie man die KW richtig ausrechnet? |
Re: Kalenderwoche Verständisproblem
![]() Google Suchwörter: Kalenderwoche Definition Edith zeigt noch diese ausführlichere Erklärung, die aber natürlich zum gleichen Ziel führt: ![]() Sherlock |
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: |
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 |
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; |
Re: Kalenderwoche Verständisproblem
Hallo,
die Berechnung der deutschen KW erfolgt nach DIN 1355. ![]() |
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; |
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...
|
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 |
Re: Kalenderwoche Verständisproblem
Zitat:
![]() Gruß Jürgen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz