none
C# Wie kann die Kalenderwoche ermittelt und diese dann an einen Ordnername anhängen ? RRS feed

  • Frage

  • Hallo erstmal und frohe Weihnachten!

    Ich habe einen Ordner in C:\Fahrzeugdaten

    Dieser soll wöchentlich mit der aktuellen Kalenderwoche versehen werden.

    Beispiel: Aktuell ist die Kw 52. Der Ordner soll nun in C:\Fahrzeugdaten Kw52 umbenannt werden.

    Lieben Gruß

    Markus

    Mittwoch, 26. Dezember 2018 11:14

Antworten

  • Hi Markus,
    hier mal eine Konsolendemo, wie man das in VB.NET machen kann. Die Kalenderwoche kann man über Calendar ermitteln, das Verzeichnis umbenennen kann man mit Move.

    Imports System.Globalization
    Imports System.IO
    
    Module Module1
      Sub Main()
        Try
          Dim c As New Demo
          c.Execute()
        Catch ex As Exception
          Console.WriteLine(ex.Message)
        End Try
        Console.WriteLine("weiter mit Taste")
        Console.ReadKey()
      End Sub
    
      Friend Class Demo
    
        Friend Sub Execute()
          Dim rootOrdner = "C:\Fahrzeugdaten"
          ' Vorbereitung
          ' Ordner "C:\Fahrzeugdaten" anlegen, wenn nicht schon vorhanden
          If Not Directory.Exists(rootOrdner) Then Directory.CreateDirectory(rootOrdner)
          ' neuen Namen des Verzeichnisses ermitteln
          Dim newName = $"{rootOrdner} " &
            CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(Now,
                                                              CalendarWeekRule.FirstFourDayWeek,
                                                              DayOfWeek.Monday).ToString
          ' Verzeichnis umbenennen
          Directory.Move(rootOrdner, newName)
        End Sub
    
      End Class
    
    End Module

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks


    Mittwoch, 26. Dezember 2018 11:48
  • Hallo Peter,

    deine Ermittlung der Kalenderwoche ist abweichend von der ISO 8601.

    (Das Datum 2018.12.31 ergibt KW53, laut Kalender müsste das KW1 ergeben)

    Was genau gewünscht ist, ist zwar nicht beschrieben, aber die Berechnung, die auch in Deutschland gültig ist, kann man so machen:

    public static int GetIso8601WeekOfYear(DateTime time)
    {
    	DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    	if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    	{
    		time = time.AddDays(3);
    	}
    	return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    }
    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Mittwoch, 26. Dezember 2018 12:36

Alle Antworten

  • Hi Markus,
    hier mal eine Konsolendemo, wie man das in VB.NET machen kann. Die Kalenderwoche kann man über Calendar ermitteln, das Verzeichnis umbenennen kann man mit Move.

    Imports System.Globalization
    Imports System.IO
    
    Module Module1
      Sub Main()
        Try
          Dim c As New Demo
          c.Execute()
        Catch ex As Exception
          Console.WriteLine(ex.Message)
        End Try
        Console.WriteLine("weiter mit Taste")
        Console.ReadKey()
      End Sub
    
      Friend Class Demo
    
        Friend Sub Execute()
          Dim rootOrdner = "C:\Fahrzeugdaten"
          ' Vorbereitung
          ' Ordner "C:\Fahrzeugdaten" anlegen, wenn nicht schon vorhanden
          If Not Directory.Exists(rootOrdner) Then Directory.CreateDirectory(rootOrdner)
          ' neuen Namen des Verzeichnisses ermitteln
          Dim newName = $"{rootOrdner} " &
            CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(Now,
                                                              CalendarWeekRule.FirstFourDayWeek,
                                                              DayOfWeek.Monday).ToString
          ' Verzeichnis umbenennen
          Directory.Move(rootOrdner, newName)
        End Sub
    
      End Class
    
    End Module

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks


    Mittwoch, 26. Dezember 2018 11:48
  • Hallo Peter,

    deine Ermittlung der Kalenderwoche ist abweichend von der ISO 8601.

    (Das Datum 2018.12.31 ergibt KW53, laut Kalender müsste das KW1 ergeben)

    Was genau gewünscht ist, ist zwar nicht beschrieben, aber die Berechnung, die auch in Deutschland gültig ist, kann man so machen:

    public static int GetIso8601WeekOfYear(DateTime time)
    {
    	DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
    	if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
    	{
    		time = time.AddDays(3);
    	}
    	return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    }
    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Mittwoch, 26. Dezember 2018 12:36
  • Hi Stefan,
    du hast natürlich Recht. Der Unsinn der ISO 8601 sieht für 2018 aber so aus, dass zur KW 1 sowohl 1.1. -4.1.18 als auch der 31.1.18 gehören.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks


    Mittwoch, 26. Dezember 2018 14:03
  • Hallo & frohes Fest auch,

    ergänzend zu den gegebenen Antworten ist es vielleicht ein Problem, wenn ein Jahr mit der KW 1 beginnt und endet (siehe z.B. 2014) oder mit KW 52 anfängt und endet (z.B. demnächst 2022). Dann würden Daten aus faktisch unterschiedlichen Wochen in ein und demselben Ordner abgelegt. Falls das also nicht gewollt ist, würde ich den Pfad noch um Jahr und Monat erweitern, z.B. 2018.01.KW01 und 2018.12.KW01.

    Gruß

    Mittwoch, 26. Dezember 2018 14:16
  • Hallo & frohes Fest auch,

    ergänzend zu den gegebenen Antworten ist es vielleicht ein Problem, wenn ein Jahr mit der KW 1 beginnt und endet (siehe z.B. 2014) oder mit KW 52 anfängt und endet (z.B. demnächst 2022). Dann würden Daten aus faktisch unterschiedlichen Wochen in ein und demselben Ordner abgelegt. Falls das also nicht gewollt ist, würde ich den Pfad noch um Jahr und Monat erweitern, z.B. 2018.01.KW01 und 2018.12.KW01.

    Gruß

    Hallo,

    du hast recht. Die KW alleine ist nicht die beste Idee. Ich erinnere mich, früher hatte ich mal einen Kunden, der wollte auch alles in Ordner nach KW gespeichert haben, war dann auch noch der Meinung, das es keine KW53 gibt. Da trat das Problem sofort beim ersten Jahreswechsel auf. Also ist für Speicherung rein nach KW die Lösung von Peter doch die bessere.

    Vielleicht erzählt uns der Markus noch um was für Daten es geht. Eventuell gibt es dann noch andere Lösungsansätze (hat bei meinen Fragen sehr oft geholfen, oftmals kamen andere/bessere Lösungen dabei raus als meine Ursprungs-Idee).

    Gruß und frohes Fest

    Stefan


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Mittwoch, 26. Dezember 2018 15:05
  • Also ist für Speicherung rein nach KW die Lösung von Peter doch die bessere.

    Hallo Stefan,

    die Lösung von Peter bleibt in gleicher Weise problematisch, beispielsweise in 2022 und 2023 beginnen die Jahre auch mit seiner Methode jeweils mit der KW 52 und enden mit der KW 52.

    Die Lösung dieses Problems ist ohne Zusatzinformationen meines Erachtens nicht eindeutig darstellbar. Man könnte natürlich auch Jahresordner anlegen und bei KW 1 beispielsweise prüfen, ob der Monat 12 ist etc., um dann den passenden Jahresordner (z.B. Jahr+1) zu wählen.

    Jedenfalls kann mit Jahr+Kalenderwoche ein eindeutiger Zeitraum definiert werden (auch nach ISO), der allerdings nicht immer komplett in einem Kalenderjahr liegen muss.

    Gruß, Klaus

    Mittwoch, 26. Dezember 2018 16:49
  • Hi,
    Klaus' Bemerkung stimmt natürlich auch:

    31.12.2021 00:00:00, KW:52 Friday
    01.01.2022 00:00:00, KW:52 Saturday
    02.01.2022 00:00:00, KW:52 Sunday
    03.01.2022 00:00:00, KW:1 Monday

    31.12.2022 00:00:00, KW:52 Saturday
    01.01.2023 00:00:00, KW:52 Sunday
    02.01.2023 00:00:00, KW:1 Monday
    03.01.2023 00:00:00, KW:1 Tuesday

    31.12.2023 00:00:00, KW:52 Sunday
    01.01.2024 00:00:00, KW:1 Monday
    02.01.2024 00:00:00, KW:1 Tuesday
    03.01.2024 00:00:00, KW:1 Wednesday

    31.12.2024 00:00:00, KW:53 Tuesday
    01.01.2025 00:00:00, KW:1 Wednesday
    02.01.2025 00:00:00, KW:1 Thursday
    03.01.2025 00:00:00, KW:1 Friday


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 26. Dezember 2018 17:07
  • Danke für das ganze Feedback.

    Der Ordner Fahrzeugdaten wird von mir angelegt. Da kommen dann verschiedene Daten rein die gesichert werden.

    Zusätzlich wird nach jedem Daten sichern der Ordner mit der aktuellen Kalenderwoche versehen. Also C:\Fahrzeugdaten Kw 52

    C:\Fahrzeugdaten Kw 53

    usw.

    Das wiederholt sich dann jede Woche. Ein Ordner mit Fahrzeugdaten wird erneut angelegt mit neuen Daten, die dann im Anschlus der Sicherung mit der nächsten Kalenderwoche versehen werden.

    Vielen lieben Dank für eure Hilfe. :-))

    Mittwoch, 26. Dezember 2018 17:26