Wie kann ich das Datum einer bestimmten Kalenderwoche in C# ermitteln.
Gruß
Steps
wie ist denn das Datum einer Kalenderwoche definiert? Nenne mir doch mal das
Datum der 1. bzw. 2. Woche dieses Jahres. Wenn die Definition klar ist, kann
man das sicher leicht errechnen.
Nebenbei,
was ist denn aus der damaligen Diskussion um die Projektentwicklung mit C#
hervorgegangen? Habt Ihr Euer Projekt mit C# begonnen oder doch mit einer
anderen Umgebung?
Gruß
Joachim
ich bräuchte z.B. den 1.Tag der KW 47 im Jahre 2006 als DateTime oder
String.
Bis jetzt sind wir noch am 'spielen' mit .Net und C#.
Aber zu 99% wird unser neues Projekt mit C# entwickelt !
Beginnen werden wir frühestens März mit der Programmierung der einzelnen
Module.
Gruß
Steps
"Joachim Fuchs" <nospam....@fuechse-online.de> wrote in message
news:eDQkwkzoBHA.1716@tkmsftngp02...
> ich bräuchte z.B. den 1.Tag der KW 47 im Jahre 2006 als DateTime oder
> String.
ja, habe ich ja verstanden. Aber mir ist die Definition der KW noch nicht
ganz klar.
Beginnt die KW1:
am 01.01. oder
am ersten Montag im Jahr (wohl eher nicht)
oder endet die KW1 am ersten Sonntag im Jahr?
oder ???
Wenn klar ist, welches der erste Tag ist, dann ist der Rest nicht so
schwierig.
Gruß
Joachim
Siehe DIN bzw. ISO-Definition, oder denkst Du jeder definiert das für sich
selber ????
http://www.salesianer.de/util/kalfaq.html#B3
Greetings
Jochen
das war genau, wonach ich gesucht habe. Ich hatte mir schon gedacht, daß die
Definition nicht so trivial ist.
Nun, mal sehen, wie man das Problem von Steps lösen kann.
Gruß
Joachim
Mit dieser Definition kommen wir der Sache schon ein bischen näher !
Ich könnte mir jetzt überlegen wie man alles errechnet.
Ich dachte allerdings es gäbe vielleicht schon eine Funktion.
In C# über VisualBasic funktioniert folgendes:
DateTime myTestDate = dateTimePicker1.Value;
label2.Text = (Microsoft.VisualBasic.DateAndTime.DatePart("WW",myTestDate,
Microsoft.VisualBasic.FirstDayOfWeek.System,
Microsoft.VisualBasic.FirstWeekOfYear.System)).ToString();
Damit bekomme ich die KW von einem Datum.
Ich hätte gerne das Datum einer KW von einem bestimmten Jahr !
Tschau
Steps
"Joachim Fuchs" <nospam....@fuechse-online.de> wrote in message
news:uvn5wW1oBHA.2512@tkmsftngp03...
hier die hoffentlich richtige Lösung, die Du Dir nur noch in eine Funktion
einbetten mußt:
int Kalenderwoche = 47; // die zu suchende KW
int Jahr = 2002; // das betreffende Jahr
//Wochentag (1..7) des 4. Januars ermitteln
DateTime vierterJanuar = new DateTime(Jahr,1,4);
int woTag4J = (int)vierterJanuar.DayOfWeek;
//Anhand des Wochentags den Beginn der ersten Woche ermitteln
DateTime DatumErsteWoche = vierterJanuar.AddDays(1-woTag4J);
//Die KW xx beginnt dann xx-1 Wochen später:
DateTime BeginKW47 = DatumErsteWoche.AddDays((Kalenderwoche-1) * 7);
Debug.WriteLine(BeginKW47);
So müßte es gehen. Überprüfe aber sicherheitshalber mal, ob für einen
Sonntag DayOfWeek den Wert 0 oder 7 hat. Ich gehe hier von 7 aus, kann aber
falsch sein.
Gruß
Joachim
Ok, dann jetzt korrigiert als fertige Funktion:
Eingabe: Jahr und Kalenderwoche als int
Ausgabe: der erste Tag der gesuchten KW als DateTime
Sinnvolle Ergänzungen: Plausibilitätsprüfung der Parameter
public static DateTime GetBeginnKW(int Jahr, int KW)
{
DateTime vierterJanuar = new DateTime(Jahr,1,4); //Datum 4.Januar des
betr. Jahres
//Nummer des Wochentags 1=Mo..7=So
int woTag4J = (((int)vierterJanuar.DayOfWeek + 6) % 7) +1;
//Dann beginnt die KW1 x Tage vorher
DateTime DatumErsteWoche = vierterJanuar.AddDays(1-woTag4J);
//Die gesuchte KW beginnt dann KW-1 Wochen später:
return DatumErsteWoche.AddDays((KW-1) * 7);
}
Gruß
Joachim
habe gewusst, dass man nicht viel programmieren muss !
Funktioniert wunderbar.
Gruss Steps
"Joachim Fuchs" <nospam....@fuechse-online.de> wrote in message
news:#ZzEhE5oBHA.1624@tkmsftngp03...
ich schon wieder !
Zu früh gelobt.
Bei KW 52,53,01 kommen falsche Ergebnisse.
Es gab 2001 keine KW 53.
Ich glaube wir lassen das besser wir haben diese Funktion in C programmiert
und die funktioniert.
Wir werden diese Funktion umschreiben.
Tschau Steps
"Steps" <ste...@hotmail.com> wrote in message
news:#fbUwv9oBHA.2456@tkmsftngp03...
Deine Fehlermeldungen kann ich nicht ganz nachvollziehen. Folgende
Ergebnisse scheinen mir richtig zu sein:
Jahr KW Datum
2001 1 01.01.2001
2001 52 24.12.2001
2002 1 31.12.2001
2002 2 07.01.2002
Bitte nenne mir Kombinationen, die ein falsches Ergebnis erzeugen.
Wenn es eine KW nicht gibt, dann kommt natürlich Unsinn heraus. Ich hatte ja
auch extra darauf hingewiesen, daß die Parameter auf Plausibilität überprüft
werden müssen. Du mußt Dir dann allerdings überlegen, wie die Funktion
reagieren soll (Exception, Rückgabe null ...).
Gruß
Joachim
anbei noch eine Funktion, die die Anzahl der KWs in einem Jahr ermittelt:
public static int GetAnzahlKW(int Jahr)
{
TimeSpan Differenz = GetBeginnKW(Jahr+1, 1) - GetBeginnKW(Jahr, 1);
return (Differenz.Days) / 7;
}
Ich habe die Funktion für verschiedene Jahre getestet, insbesondere mit den
in der Norm angegebenen Jahren mit 53KWs: 1976, 1981, 1987, 1992 und 1998.
Du kannst sie benutzen, um beispielsweise eine Schleife für ein Jahr
aufzubauen:
for (int i=1; i< GetAnzahlKW(2002); i++) Debug.WriteLine(GetBeginnKW(2002,
i));
Wenn Du Fehler findest, bitte melden. Das interessiert mich auch.
Gruß
Joachim
du hast recht deine Funktion rechnet richtig !
Ich habe vermutlich ein falsches Ergebnis weil ich noch eine Basic Funktion
aufrufe,
die mir eine falsche KW zurückgibt.
//
DateTime myTestDate = dateTimePicker1.Value;
label2.Text = (Microsoft.VisualBasic.DateAndTime.DatePart("WW",myTestDate,
Microsoft.VisualBasic.FirstDayOfWeek.System,
Microsoft.VisualBasic.FirstWeekOfYear.System)).ToString();
//
Hiermit bekomme ich am 31.12.2001 die KW53, die gibts aber gar nicht !
Hab mir noch keine Gedanken über diese Basic Funktion gemacht.
Vermutlich stimmt was nicht an den Übergabeparametern.
Gruß
Steps
"Joachim Fuchs" <nospam....@fuechse-online.de> wrote in message
news:#vCple#oBHA.2024@tkmsftngp03...
das Thema fasziniert mich. Daher noch die Funktion, um aus einem Datum die
KW zu errechnen. Leider genügt hier als Rückgabewert nicht ein int, sondern
man muß ja auch noch das Jahr zurückgeben (31.12.2001 liegt ja in der KW1
von 2002). Daher eine Struktur für die Rückgabe.
public struct Kalenderwoche
{
public int KW, Jahr;
public Kalenderwoche(int kw, int jahr)
{
KW = kw;
Jahr = jahr;
}
}
public static Kalenderwoche GetKW(DateTime Datum)
{
int Jahr = Datum.Year;
DateTime Tag1 = GetBeginnKW(Jahr, 1);
DateTime Tag2 = GetBeginnKW(Jahr+1, 1);
if (Datum >= Tag2)
return new Kalenderwoche(1, Jahr+1);
else
return new Kalenderwoche((Datum - Tag1).Days / 7 + 1, Jahr);
}
Testbeispiel:
DateTime tag = new DateTime(2001,12,20);
for (int i=1; i<50; i++)
{
Kalenderwoche kawo = GetKW(tag);
Debug.WriteLine(tag + ": KW" + kawo.KW + " / " + kawo.Jahr );
tag = tag.AddDays(1);
}
Gruß,
Joachim
"Steps" <ste...@hotmail.com> schrieb im Newsbeitrag
news:e9CJSh1oBHA.2352@tkmsftngp04...
Es ist zwar schön, macht aber wenig Sinn (siehe weiter oben), da es eine ISO
Definition gibt... (die fast weltweit anerkannt wurde...)
Greetings
Jochen
in der Hilfe zu finden unter
ms-help://MS.VSCC/MS.MSDNVS/cpref/html/frlrfSystemGlobalizationCalendarClassGetWeekOfYearTopic.htm
Parameters
time
The DateTime to read.
rule
A CalendarWeekRule value that defines a calendar week.
firstDayOfWeek
A DayOfWeek value that represents the first day of the week.
Return Value
An integer that represents the week of the year that includes the date in time.
Exceptions:
Exception Type
ArgumentOutOfRangeException
Condition :
firstDayOfWeek is outside the range supported by the calendar.
-or-
rule is not a valid CalendarWeekRule value.
Remarks
FirstDayOfWeek of CultureInfo.DateTimeFormat contains the default DayOfWeek value that represents the first day of the week for a
specific culture.
CalendarWeekRule of CultureInfo.DateTimeFormat contains the default CalendarWeekRule value that defines a calendar week for a
specific culture.
This method can also be used to determine the number of weeks in the year by setting time to the last day of the year.
HTH,
Rob.
"Steps" <ste...@hotmail.com> wrote in message news:OGe#08#oBHA.2484@tkmsftngp02...
auch nicht schlecht. Aber wenn ich mir die Doku ansehe, dann stimmt das
irgendwie nicht mit unserer Zeitrechnung überein: Stellt man
CalenderWeekRule auf FirstFourDayWeek, dann hat die erste Woche laut
Beschreibung nur 5 Tage.
Ich fürchte, daß die Amerikanischen Berechnungen nicht exakt den
Europäischen Normen entsprechen. Warum sollten sie auch, in USA gibt's ja
immer noch Meilen...
Danke,
Joachim