Hallo zusammen!
Ich suche gerade nach einer Funktion die mir die Anzahl der Wochen eines angegebenen Jahres zurückgibt und kann leider nichts finden.
Im GregorianCalender gibt es die Methoden "GetDaysInYear" und "GetMonthsInYear" aber kein "GetWeeksInYear".
Vielleicht brauche ich die Methode gar nicht, aber dafür müsstet ihr mir in Sachen Allgemeinwissen ein wenig auf die Sprünge helfen 😉:
Gibt es im Jahr immer 52 Wochen oder kann das zB. in einem Schaltjahr variieren? Kann leider über google keine brauchbaren Antworten finden (wahrscheinlich weil ich nicht nach dem richtigen suche...).
Danke, mfg
mike
so wird es was:
CultureInfo CUI := CultureInfo.CreateSpecificCulture('de-DE');
int Week := CUI.Calendar.GetWeekOfYear(DateTime.get_Now,
CUI.DateTimeFormat.CalendarWeekRule, CUI.DateTimeFormat.FirstDayOfWeek);
zumindestens ein Ansatz.
raik
naja normalerweise hast du 365 tage im jahr (schaltjahr 366)
das macht 52 wochen genau... also genaugenommen 52 *7 = 364... tage plus ein überbleibsel tag 😉
was auch der grund dafür ist das ein tag wie der 1.3 im jahre X ein montag ist, im X+1 jahr dann ein dienstag wäre... ausser es funkt ein schaltjahr dazwischen
aber ich lese gerade deine frage nochmal....
ja es sind rechnerisch immer 52 VOLLE wochen und dann entweder ein überbleibsel tag oder 2
edit: dieser beitrag kam ohne SoruceCode und wertvolle Informationen aus 👅 👅 👅
Mfg
IamTheBug
hi suamikim
habe mal etwas ähnliches in vb und sql schreiben müssen.
die kalenderwoche 53 existiert dann, wenn der 1. januar hinter den donnerstag rutscht, also der größere teil der woche noch vom alten jahr bestimmt wird.
hier die codes.
Public Function KW(Optional aDate As Date = 0) As Byte
' Liefert die Kalenderwoche des angegebenen/aktuellen DatumsDim doY As Integer
Dim dt As Date
Dim result As Byte' Wenn kein Datum angegeben, dann vom aktuellen Datum ausgehen
If aDate = 0 Then
dt = Date
doY = DayOfYear(Date)
Else
dt = aDate
doY = DayOfYear(aDate)
End If' Folgendes Konstrukt sorgt für Teilbarkeit des Jahrestages durch 7
doY = doY - (1 + (WeekDay(dt, vbMonday) - WeekDay(DateValue("01.01." & Year(dt)), vbMonday)))' Woche berechnen:
result = doY / 7' Korrektur, wenn der 1. Januar auf einen Tag nach Donnerstag fiel
If (WeekDay(DateValue("01.01." & Year(dt)), vbMonday) > 4) Then
If (result = 0) Then result = KW(CDate("31.12." & Year(dt) - 1))
Else
' Korrektur, wenn das Jahr 53 Wochen hat
If (WeekDay(DateValue("31.12." & Year(dt)), vbMonday) < 4) Then
result = result
Else
result = result + 1
End If
End IfKW = iif(result = 0, 1, result)
End Function
'—————————————————————
und als SQL funktion
CREATE FUNCTION dbo.udf_ISOKW(@date dateTime = 0)
RETURNS tinyInt
AS BEGINdeclare @result tinyInt
declare @weekday tinyInt
declare @change intSET @change = 0
SELECT @weekday = DATEPART(weekday, 'Jan, 1 ' + CAST(DATEPART(year, @date) AS CHAR(4)))
IF @weekday > 5 SET @change = -1
SELECT @result = DATEPART(week, @date) + @change
return @result
END
Ok, danke für die hilfe!
Eigentlich muss ich mich ja schämen so eine frage überhaupt zu stellen, wäre ich nicht so verwöhnt und hätte mich aufs framework verlassen, dass es da bestimmt eine entsprechende methode gibt oder das mir google auf die sprünge hilft, hätt ich das zumindest selbst in aller kürze überlegen können 😉
Tut zwar nichts zur sache, aber warum gibt es eine MonthsInYear- aber keine WeeksInYear-Funktion? Macht doch eigntlich nicht viel sinn, die Anzahl der Monate ist ja auch nicht gerade variabel...
edit:
@citizen.ron
Es geht mir nur darum, dass ich zu einem bestimmten Datum immer die aktuelle Kalenderwoche in einem NumericUpDown-Control anzeige, wobei ich dessen MaxValue auf 52 setze und keine überraschung erleben will, wenn es wie du erwähnt hast vielleicht eine 53. Woche gibt.
Die aktuelle Kalenderwoche zu einem Datum hole ich mir über
gregorianCal.GetWeekOfYear(actDate, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
Wenn meine überlegung jetzt stimmt und ich dich richtig verstanden habe ist die 53. Woche aber aufgrund des Attributs FirstFourDayWeek ausgeschlossen (da die 1. Woche bestimmt 4 Tage hat...).
Korrigiert mich, wenn ich daneben liege 😉
hallo,
also generell hat ein Jahr schon 52 Wochen, wenn aber Kalender Wochen (z. B.: diese Woche KW15) gemeint sind, dann kann es davon auch 53 geben.
Klingt komisch, ist aber so. Und zwar sieht die Definion folgender Maßen aus: Wenn eine Woche mindestens 3 Werktage die im selben Jahr liegen, dann ist es eine Kalenderwoche in diesem Jahr (siehe Jahr 2004, Mittwoch 29.12.04, Donnerstag 30.12.04, Freitag 31.12.04).
-yellow
edit:
@citizen_ron upps... da war jemand schneller
Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).
Mein Blog: Yellow's Blog auf sqlgut.de
Denke zwar, das ich zuvor mit der Annahme
Die aktuelle Kalenderwoche zu einem Datum hole ich mir über
C#-Code:
gregorianCal.GetWeekOfYear(actDate, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)Wenn meine überlegung jetzt stimmt und ich dich richtig verstanden habe ist die 53. Woche aber aufgrund des Attributs FirstFourDayWeek ausgeschlossen (da die 1. Woche bestimmt 4 Tage hat...).
richtig gelegen bin, würde mich trotzdem über eine Bestätigung freuen, damit ich mir auch sicher sein kann 😉
danke
oh ja! Hoch kompliziert denn die KW1 kann auch im Alten Jahr schon beginnen!! 😉
Schade, dass es die Kalenderwochenfunktion nicht in .NET 2.0 geschafft hat, oder ist das was speziell Deutsches? Eine der wichtigsten Funktion in Zusammenhang mit DateTime und nicht dabei, merkwürdig.
Das problem bei der Kalenderwoche, ist, das die Deutsche Woche Montag anfängt und alle anderen am Sonntag.
Somit ist die Auswertung der CulturInfo unabdinglich, wenn man in verschiedenen Sprachen entwickeln will.
Warten wir ab, ob es in .Net 3.0 drin ist. 😁
raik
Edit // Dicke Finger und kleine Tasten
Nun gut, das ist doch kein Problem. Ich habe schon DateTime-Ergänzungen gesehen, die es erlauben, den Beginn der Woche explizit anzugeben (Sonntag/Montag).
Ich habe schon DateTime-Ergänzungen gesehen, die es erlauben, den Beginn der Woche explizit anzugeben (Sonntag/Montag).
kannst du diese mir mal zukommen lassen?
danke raik
Soda, hätte jetzt noch ein Problem:
Wie kann ich zu einer angegebenen Kalenderwoche und Jahr das Datum bekommen (also den 1. Tag der Woche, Montag).
Wenn der Benutzer also das Jahr 2006 und die Kalenderwoche 15 (diese Woche) wählt will ich als Ergebnis Mo, 10. Apr 2006 bekommen...
Kann leider keine Methode im FW finden (weder bei DateTime noch GregorianCalender) aber hoffe trotzdem das es diese gibt und ich das ganze nicht großartig selbst berechnen muss...
danke
edit:
Das resultierende Datum muss nicht unbedingt der 1. Tag der Woche (Mo) sein, sondern kann irgendein Tag in dieser Woche sein (Mo - So)...
hier eine Funktion. ist zwar Delphi.net sollte aber kein Problem sein Sie umzuschreiben.
function Get_StartDay(dVAlue: Integer): DateTime;
var
fCUI: CultureInfo;
FirstDay 😄ayofWeek;
FirstDate 😄ateTime;
TempWeek :Integer;
begin
TempWeek:= 1;
If (0 < dValue) and (dVAlue < 54) then
begin
fCUI:= CultureInfo.get_CurrentCulture;
FirstDate:= DateTime.Create(fCUI.DateTimeFormat.Calendar.GetYear(DateTime.Now), 1, 1);
while TempWeek <> dValue do
begin
FirstDate := FirstDate.AddDays(1);
TempWeek:= fCUI.Calendar.GetWeekOfYear(FirstDate
,fCUI.DateTimeFormat.CalendarWeekRule
,fCUI.DateTimeFormat.FirstDayOfWeek);
end;
FirstDay:= fCUI.Calendar.GetDayOfWeek(FirstDate);
case FirstDay of
DayOfWeek.Monday : FirstDaTe:= FirstDate.AddDays( 0);
DayOfWeek.Tuesday : FirstDate:= FirstDate.AddDays(-1);
DayOFWeek.Wednesday: FirstDate:= FirstDate.AddDays(-2);
DayOFWeek.Thursday : FirstDate:= FirstDate.AddDays(-3);
DayOfWeek.Friday : FirstDate:= FirstDate.AddDays(-4);
DayOfWeek.Saturday : FirstDate:= FirstDate.AddDays(-5);
DayOfWeek.Sunday : FirstDate:= FirstDate.AddDays(-6);
end;
result:= FirstDate;
end;
end;
Danke, werde mir das mal ansehen und versuchen es zu konvertieren. Falls noch jemand eine einfachere Methode weiß (also ohne eigene Berechnung) wäre ich trotzdem sehr dankbar!