Kalenderwoche einem Monat zuordnen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Kalenderwoche einem Monat zuordnen

    Hi,

    ich habe Daten die Kalenderwochen zugeordnet sind. Jetzt sollen diese Daten Monaten zugeordnet werden. Allerdings besteht das Problem, dass Kalenderwochen nicht völlig Deckungsgleich mit den Monaten sind.
    Es gibt einige Kalenderwochen, die in zwei Monaten liegen. Die Daten beziehen sich aber tatsächlich auf ganze Wochen und können nicht einzelnen Tagen zugeordnet werden. Jetzt wurde entschieden, dass eine
    solche Kalenderwoche immer dem Monat zugeschrieben wird, in dem sie mehr Tage hat.
    Das versuche ich jetzt gerade zu realisieren:

    VB.NET-Quellcode

    1. Imports Itenso.TimePeriod
    2. Public Function GetStartOfWeek(ByVal year As Integer, ByVal weekOfYear As Integer) As DateTime
    3. Dim week As Week = New Week(year, weekOfYear)
    4. If week.Start.Month <> week.End.Month Then
    5. ...
    6. End If
    7. Return week.Start
    8. End Function


    Momentan wird einfach der Wochenanfang übergeben. Ergo wird die Kalenderwoche immer dem vorherigen Monat zugeschrieben. Wie man sieht wird bereits der Fall ermittelt, ob eine KW zwischen den Monaten liegt week.Start.Month <> week.End.Month
    Month ist einfach ein Integer. Mein Problem ist, dass ich nicht von diesem Integer auf den ersten Tag des Monats komme um zu ermitteln um was für einen Wochentag es sich handelt. Month lässt sich auch nicht einfach in ein Date umwandeln.
    Jemand ne Idee?
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Ich glaube ich habe dich noch nicht so ganz verstanden was du erreichen willst.
    Kannst du das mal ein einem kurzen Beispiel verdeutlichen?

    Da eine KW maximal in 2 Monaten liegt könntest du immer Montag und Sonntag ermitteln und so die der KW zugehörigen Monate ermitteln.
    Hier auf deutsches und englisches Wochenformat aufpassen im engl. ist So der 1. Tag der Woche.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Du könntest dir ein Dictionary mit den Monaten und Anzahl der Tagen erstellen, da du den Startwert der Woche hast zb. 28.03. musst du diesen nur von der Anzahl an Tagen für den Monat (März: 31) subtrahieren und dann schauen ob das Ergebnis größer als 3 ist.

    Beispiel:
    KW 13, 28.03. bis 03.04.
    März hat 31 Tage + 1
    32 - 28 = 4
    4 > 3 = wahr = KW13 hatte mehr Tage im Monat März (4) als im April (3)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „slice“ ()

    ich kenne nur ein vergleichbares Problem, nämlich wieviele Kalenderwochen ein Jahr hat.
    Also ob die Woche zum Jahreswechsel zum alten oder zum neuen gehört.
    Da gibts glaub eine DIN-Vorschrift für.
    Ich denke, für die Monats-Zuordnung sollte die ebenso anwendbar sein, evtl. ist das sogar vorgesehen.

    Ein Fall für google
    @ErfinderDesRades Du meinst ISO 8601
    [...] Als erste Kalenderwoche im Jahr wird die Woche mit dem ersten Januar-Donnerstag definiert. Dadurch fällt der 4. Januar immer in die erste Kalenderwoche.
    Reduziert:
    Ich habe einen Integer im Bereich von 1-12 (ka wieso nicht 0-basiert, ist aber so). Der steht für die Monate Januar - Dezember. Jetzt brauche ich von diesem Monat den ersten Wochentag (Montag-Sonntag).

    Ich muss also irgendwie von diesem Int auf DateTime.Month kommen, dann kann ich den ersten Tag ermitteln.

    Ps: Der Ursprungsdatensatz hat einen Integer Year und einen Int Kalendarweek. Ein DateTime.Date habe ich nicht.
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nils_Kr“ ()

    Perfekt, danke.
    Ich hab den DayOfWeek übrigens in einen Int umgewandelt. Wenn der dann < 2 wird die Woche dem vorherigen Monat zugeordnet, bei >= 2 dem folgenden.

    PS: Danke @Schamash standardmäßig ist das englische Datumsformat aktiv, für Montag bis Mittwoch verwende ich dann 1-3. Aber die Woche mit einem Sonntag beginnen, die spinnen doch die Amis/Briten :D
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nils_Kr“ ()

    Nils_Kr schrieb:

    Jetzt wurde entschieden, dass eine
    solche Kalenderwoche immer dem Monat zugeschrieben wird, in dem sie mehr Tage hat.
    Ich habe einmal eine Funktion gemacht, die das Datum des Montags der aktuellen Woche zurückgibt (siehe Zeile #8)
    und habe die Methode ein wenig erweitert. Ab diesem Wochen-Montag wird einfach der Monatsrest zum Ersten des nächsten Monats berechnet und als Ergebnis einfach der Wochenanteil im aktuellen Monat >=4 zurückgegeben.
    Es muss aber dabei ein Datum der Funktion übergeben werden. Vl. hilft dir das weiter...

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub DateTimePicker1_ValueChanged(sender As Object, e As EventArgs) Handles DateTimePicker1.ValueChanged
    4. CheckBox1.Checked = IsWeekOfCurrentMonth(DateTimePicker1.Value)
    5. End Sub
    6. Private Function IsWeekOfCurrentMonth(ByVal actualDate As Date) As Boolean
    7. Dim weeksFirst = actualDate.AddDays(-((actualDate.DayOfWeek + 7 - DayOfWeek.Monday) Mod 7))
    8. Dim monthsFirst = weeksFirst.AddMonths(1).AddDays(1 - weeksFirst.Day)
    9. Return Not ((weeksFirst.Month = actualDate.Month) Xor (monthsFirst.Subtract(weeksFirst).Days >= 4))
    10. End Function
    11. End Class

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VB1963“ ()

    Nils_Kr schrieb:

    die Woche mit einem Sonntag beginnen
    taten auch die Deutschen jahrhundertelang (bis 1976).
    Wenn die Woche am Sonntag beginnt, stimmt wenigstens der Begriff Mittwoch für den mittleren Tag der Woche. ;)
    Alles eine Frage der Definition.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --