AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kalenderwoche Verständisproblem

Ein Thema von Xzeer · begonnen am 3. Feb 2009 · letzter Beitrag vom 4. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Xzeer
Xzeer

Registriert seit: 6. Jul 2007
106 Beiträge
 
#1

Kalenderwoche Verständisproblem

  Alt 3. Feb 2009, 15:38
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?
Marvin
Xzeer
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.762 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Kalenderwoche Verständisproblem

  Alt 3. Feb 2009, 15:42
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
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von Xzeer
Xzeer

Registriert seit: 6. Jul 2007
106 Beiträge
 
#3

Re: Kalenderwoche Verständisproblem

  Alt 3. Feb 2009, 15:53
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?
Marvin
Xzeer
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.762 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Kalenderwoche Verständisproblem

  Alt 3. Feb 2009, 16:01
Also auf Nummer sicher kannst Du da mit DateUtils.DaysBetween gehen. Nimmst einfach die Differenz zwischen 0 und dem gewünschten Datum.

Sherlock
Oliver
  Mit Zitat antworten Zitat
tomsson74

Registriert seit: 8. Jan 2008
73 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Kalenderwoche Verständisproblem

  Alt 3. Feb 2009, 16:31
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;
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#6

Re: Kalenderwoche Verständisproblem

  Alt 3. Feb 2009, 16:37
Hallo,

die Berechnung der deutschen KW erfolgt nach DIN 1355.

Hier gibts eine Funktion, ist zwar C, aber leicht verständlich.
Gruß, Jan
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Kalenderwoche Verständisproblem

  Alt 3. Feb 2009, 16:41
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;
  Mit Zitat antworten Zitat
Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#8

Re: Kalenderwoche Verständisproblem

  Alt 3. Feb 2009, 17:16
@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...
Gruß, Jan
  Mit Zitat antworten Zitat
globetrotter77

Registriert seit: 16. Jan 2009
Ort: Nürnberg
236 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: Kalenderwoche Verständisproblem

  Alt 4. Feb 2009, 00:07
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?
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#10

Re: Kalenderwoche Verständisproblem

  Alt 4. Feb 2009, 09:11
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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 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