Laden...

WeeksInYear

Erstellt von skaface vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.182 Views
skaface Themenstarter:in
245 Beiträge seit 2005
vor 18 Jahren
WeeksInYear

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

K
231 Beiträge seit 2005
vor 18 Jahren

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

I
401 Beiträge seit 2006
vor 18 Jahren

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

432 Beiträge seit 2005
vor 18 Jahren

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 Datums

Dim 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 If

KW = iif(result = 0, 1, result)

End Function
'—————————————————————

und als SQL funktion

CREATE FUNCTION dbo.udf_ISOKW(@date dateTime = 0)
RETURNS tinyInt
AS BEGIN

declare @result tinyInt
declare @weekday tinyInt
declare @change int

SET @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

skaface Themenstarter:in
245 Beiträge seit 2005
vor 18 Jahren

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 😉

476 Beiträge seit 2004
vor 18 Jahren
52 Wochen... ja... aber...

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

edit2:
ISO 8601 - Die Darstellung des Datums

Selbst ein Weg von tausend Meilen beginnt mit einem Schritt (chinesisches Sprichwort).

Mein Blog: Yellow's Blog auf sqlgut.de

skaface Themenstarter:in
245 Beiträge seit 2005
vor 18 Jahren

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

181 Beiträge seit 2006
vor 18 Jahren

oh ja! Hoch kompliziert denn die KW1 kann auch im Alten Jahr schon beginnen!! 😉

S
8.746 Beiträge seit 2005
vor 18 Jahren

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.

K
231 Beiträge seit 2005
vor 18 Jahren

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

S
8.746 Beiträge seit 2005
vor 18 Jahren

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).

K
231 Beiträge seit 2005
vor 18 Jahren

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

skaface Themenstarter:in
245 Beiträge seit 2005
vor 18 Jahren

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)...

K
231 Beiträge seit 2005
vor 18 Jahren

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;

skaface Themenstarter:in
245 Beiträge seit 2005
vor 18 Jahren

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!