Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WeeksInYear
skaface
myCSharp.de - Member

Avatar #avatar-2165.jpg


Dabei seit:
Beiträge: 245
Herkunft: Linz, Österreich

Themenstarter:

WeeksInYear

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
kiar
myCSharp.de - Member



Dabei seit:
Beiträge: 231
Herkunft: Sachsen Anhalt

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
IamTheBug
myCSharp.de - Member



Dabei seit:
Beiträge: 401

beantworten | zitieren | melden

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 :tongue: :tongue: :tongue:
Mfg

IamTheBug
private Nachricht | Beiträge des Benutzers
citizen.ron
myCSharp.de - Member

Avatar #avatar-1693.jpg


Dabei seit:
Beiträge: 432
Herkunft: Frankfurt / Main

beantworten | zitieren | melden

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

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
Zitat

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
private Nachricht | Beiträge des Benutzers
skaface
myCSharp.de - Member

Avatar #avatar-2165.jpg


Dabei seit:
Beiträge: 245
Herkunft: Linz, Österreich

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Yellow
myCSharp.de - Experte

Avatar #avatar-2347.png


Dabei seit:
Beiträge: 476

52 Wochen... ja... aber...

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
skaface
myCSharp.de - Member

Avatar #avatar-2165.jpg


Dabei seit:
Beiträge: 245
Herkunft: Linz, Österreich

Themenstarter:

beantworten | zitieren | melden

Denke zwar, das ich zuvor mit der Annahme
Zitat
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
private Nachricht | Beiträge des Benutzers
polofreak
myCSharp.de - Member

Avatar #avatar-1895.jpg


Dabei seit:
Beiträge: 181
Herkunft: D BW

beantworten | zitieren | melden

oh ja! Hoch kompliziert denn die KW1 kann auch im Alten Jahr schon beginnen!!
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
kiar
myCSharp.de - Member



Dabei seit:
Beiträge: 231
Herkunft: Sachsen Anhalt

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

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).
private Nachricht | Beiträge des Benutzers
kiar
myCSharp.de - Member



Dabei seit:
Beiträge: 231
Herkunft: Sachsen Anhalt

beantworten | zitieren | melden

Zitat
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
private Nachricht | Beiträge des Benutzers
skaface
myCSharp.de - Member

Avatar #avatar-2165.jpg


Dabei seit:
Beiträge: 245
Herkunft: Linz, Österreich

Themenstarter:

beantworten | zitieren | melden

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)...
private Nachricht | Beiträge des Benutzers
kiar
myCSharp.de - Member



Dabei seit:
Beiträge: 231
Herkunft: Sachsen Anhalt

beantworten | zitieren | melden

hier eine Funktion. ist zwar Delphi.net sollte aber kein Problem sein Sie umzuschreiben.
Zitat
function Get_StartDay(dVAlue: Integer): DateTime;
var
fCUI: CultureInfo;
FirstDay :DayofWeek;
FirstDate :DateTime;
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;
private Nachricht | Beiträge des Benutzers
skaface
myCSharp.de - Member

Avatar #avatar-2165.jpg


Dabei seit:
Beiträge: 245
Herkunft: Linz, Österreich

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers