datumsberechnungen

 1from datetime import datetime, timedelta
 2import locale
 3from typing import Optional
 4
 5
 6class Datumsberechnungen:
 7    """
 8    Diese Klasse enthält Methoden für Datumsarithmetik mit einem Referenzdatum als Startdatum.
 9    """
10
11    def __init__(self, referenz_datum: Optional[str] = None):
12        """
13        Initialisierer für Datumsberechnungen.
14
15        Args:
16            referenz_datum: Referenzdatum im ISO-Format (YYYY-MM-DD).
17                          Falls None, wird das aktuelle Datum verwendet.
18        """
19        if referenz_datum is None:
20            # Aktuelles Datum verwenden
21            self._heute_datetime = datetime.now()
22        else:
23            # Referenzdatum aus ISO-String parsen (str: string parse time)
24            try:
25                self._heute_datetime = datetime.strptime(referenz_datum, '%Y-%m-%d')
26            except ValueError as e:
27                raise ValueError(f"Ungültiges Datumsformat '{referenz_datum}'. Erwartet: YYYY-MM-DD") from e
28
29        # Locale auf Deutsch setzen (falls verfügbar)
30        try:
31            locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
32        except locale.Error:
33            try:
34                locale.setlocale(locale.LC_TIME, 'German_Germany.1252')
35            except locale.Error:
36                # Fallback: Englisch verwenden
37                pass
38
39    def _formatiere_datum_mit_wochentag(self, datum: datetime) -> str:
40        """
41        Formatiert ein Datum mit dem entsprechenden deutschen Wochentag.
42
43        Args:
44            datum: Das zu formatierende Datum
45
46        Returns:
47            String im Format DD.MM.YYYY (Wochentag), z.B. "15.01.2024 (Montag)"
48        """
49        # Deutsche Wochentage
50        deutsche_wochentage = {
51            0: "Montag",
52            1: "Dienstag",
53            2: "Mittwoch",
54            3: "Donnerstag",
55            4: "Freitag",
56            5: "Samstag",
57            6: "Sonntag"
58        }
59
60        datum_str = datum.strftime("%d.%m.%Y")
61        wochentag = deutsche_wochentage[datum.weekday()]
62
63        return f"{datum_str} ({wochentag})"
64
65    def heute_plus_tage(self, anzahl_tage: int) -> str:
66        """
67        Addiert Anzahl tage auf heutiges Datum und gibt das Ergebnisdatum zurück.
68
69        Args:
70            anzahl_tage: Anzahl Tage, die auf heutiges Datum zu addieren ist;
71                        kann auch negativ sein.
72
73        Returns:
74            String mit Ergebnisdatum im Format DD.MM.YYYY (Wochentag), z.B. "15.01.2024 (Montag)".
75        """
76        ergebnis_datum = self._heute_datetime + timedelta(days=anzahl_tage)
77        return self._formatiere_datum_mit_wochentag(ergebnis_datum)
78
79    def heute_minus_tage(self, anzahl_tage: int) -> str:
80        """
81        Subtrahiert Anzahl Tage vom heutigen Datum und gibt das Ergebnisdatum zurück.
82
83        Args:
84            anzahl_tage: Anzahl Tage, die vom heutigen Datum zu subtrahieren ist;
85                        sollte positiv sein.
86
87        Returns:
88            String mit Ergebnisdatum im Format DD.MM.YYYY (Wochentag), z.B. "15.01.2024 (Montag)".
89        """
90        return self.heute_plus_tage(-anzahl_tage)
class Datumsberechnungen:
 7class Datumsberechnungen:
 8    """
 9    Diese Klasse enthält Methoden für Datumsarithmetik mit einem Referenzdatum als Startdatum.
10    """
11
12    def __init__(self, referenz_datum: Optional[str] = None):
13        """
14        Initialisierer für Datumsberechnungen.
15
16        Args:
17            referenz_datum: Referenzdatum im ISO-Format (YYYY-MM-DD).
18                          Falls None, wird das aktuelle Datum verwendet.
19        """
20        if referenz_datum is None:
21            # Aktuelles Datum verwenden
22            self._heute_datetime = datetime.now()
23        else:
24            # Referenzdatum aus ISO-String parsen (str: string parse time)
25            try:
26                self._heute_datetime = datetime.strptime(referenz_datum, '%Y-%m-%d')
27            except ValueError as e:
28                raise ValueError(f"Ungültiges Datumsformat '{referenz_datum}'. Erwartet: YYYY-MM-DD") from e
29
30        # Locale auf Deutsch setzen (falls verfügbar)
31        try:
32            locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
33        except locale.Error:
34            try:
35                locale.setlocale(locale.LC_TIME, 'German_Germany.1252')
36            except locale.Error:
37                # Fallback: Englisch verwenden
38                pass
39
40    def _formatiere_datum_mit_wochentag(self, datum: datetime) -> str:
41        """
42        Formatiert ein Datum mit dem entsprechenden deutschen Wochentag.
43
44        Args:
45            datum: Das zu formatierende Datum
46
47        Returns:
48            String im Format DD.MM.YYYY (Wochentag), z.B. "15.01.2024 (Montag)"
49        """
50        # Deutsche Wochentage
51        deutsche_wochentage = {
52            0: "Montag",
53            1: "Dienstag",
54            2: "Mittwoch",
55            3: "Donnerstag",
56            4: "Freitag",
57            5: "Samstag",
58            6: "Sonntag"
59        }
60
61        datum_str = datum.strftime("%d.%m.%Y")
62        wochentag = deutsche_wochentage[datum.weekday()]
63
64        return f"{datum_str} ({wochentag})"
65
66    def heute_plus_tage(self, anzahl_tage: int) -> str:
67        """
68        Addiert Anzahl tage auf heutiges Datum und gibt das Ergebnisdatum zurück.
69
70        Args:
71            anzahl_tage: Anzahl Tage, die auf heutiges Datum zu addieren ist;
72                        kann auch negativ sein.
73
74        Returns:
75            String mit Ergebnisdatum im Format DD.MM.YYYY (Wochentag), z.B. "15.01.2024 (Montag)".
76        """
77        ergebnis_datum = self._heute_datetime + timedelta(days=anzahl_tage)
78        return self._formatiere_datum_mit_wochentag(ergebnis_datum)
79
80    def heute_minus_tage(self, anzahl_tage: int) -> str:
81        """
82        Subtrahiert Anzahl Tage vom heutigen Datum und gibt das Ergebnisdatum zurück.
83
84        Args:
85            anzahl_tage: Anzahl Tage, die vom heutigen Datum zu subtrahieren ist;
86                        sollte positiv sein.
87
88        Returns:
89            String mit Ergebnisdatum im Format DD.MM.YYYY (Wochentag), z.B. "15.01.2024 (Montag)".
90        """
91        return self.heute_plus_tage(-anzahl_tage)

Diese Klasse enthält Methoden für Datumsarithmetik mit einem Referenzdatum als Startdatum.

Datumsberechnungen(referenz_datum: str | None = None)
12    def __init__(self, referenz_datum: Optional[str] = None):
13        """
14        Initialisierer für Datumsberechnungen.
15
16        Args:
17            referenz_datum: Referenzdatum im ISO-Format (YYYY-MM-DD).
18                          Falls None, wird das aktuelle Datum verwendet.
19        """
20        if referenz_datum is None:
21            # Aktuelles Datum verwenden
22            self._heute_datetime = datetime.now()
23        else:
24            # Referenzdatum aus ISO-String parsen (str: string parse time)
25            try:
26                self._heute_datetime = datetime.strptime(referenz_datum, '%Y-%m-%d')
27            except ValueError as e:
28                raise ValueError(f"Ungültiges Datumsformat '{referenz_datum}'. Erwartet: YYYY-MM-DD") from e
29
30        # Locale auf Deutsch setzen (falls verfügbar)
31        try:
32            locale.setlocale(locale.LC_TIME, 'de_DE.UTF-8')
33        except locale.Error:
34            try:
35                locale.setlocale(locale.LC_TIME, 'German_Germany.1252')
36            except locale.Error:
37                # Fallback: Englisch verwenden
38                pass

Initialisierer für Datumsberechnungen.

Args: referenz_datum: Referenzdatum im ISO-Format (YYYY-MM-DD). Falls None, wird das aktuelle Datum verwendet.

def heute_plus_tage(self, anzahl_tage: int) -> str:
66    def heute_plus_tage(self, anzahl_tage: int) -> str:
67        """
68        Addiert Anzahl tage auf heutiges Datum und gibt das Ergebnisdatum zurück.
69
70        Args:
71            anzahl_tage: Anzahl Tage, die auf heutiges Datum zu addieren ist;
72                        kann auch negativ sein.
73
74        Returns:
75            String mit Ergebnisdatum im Format DD.MM.YYYY (Wochentag), z.B. "15.01.2024 (Montag)".
76        """
77        ergebnis_datum = self._heute_datetime + timedelta(days=anzahl_tage)
78        return self._formatiere_datum_mit_wochentag(ergebnis_datum)

Addiert Anzahl tage auf heutiges Datum und gibt das Ergebnisdatum zurück.

Args: anzahl_tage: Anzahl Tage, die auf heutiges Datum zu addieren ist; kann auch negativ sein.

Returns: String mit Ergebnisdatum im Format DD.MM.YYYY (Wochentag), z.B. "15.01.2024 (Montag)".

def heute_minus_tage(self, anzahl_tage: int) -> str:
80    def heute_minus_tage(self, anzahl_tage: int) -> str:
81        """
82        Subtrahiert Anzahl Tage vom heutigen Datum und gibt das Ergebnisdatum zurück.
83
84        Args:
85            anzahl_tage: Anzahl Tage, die vom heutigen Datum zu subtrahieren ist;
86                        sollte positiv sein.
87
88        Returns:
89            String mit Ergebnisdatum im Format DD.MM.YYYY (Wochentag), z.B. "15.01.2024 (Montag)".
90        """
91        return self.heute_plus_tage(-anzahl_tage)

Subtrahiert Anzahl Tage vom heutigen Datum und gibt das Ergebnisdatum zurück.

Args: anzahl_tage: Anzahl Tage, die vom heutigen Datum zu subtrahieren ist; sollte positiv sein.

Returns: String mit Ergebnisdatum im Format DD.MM.YYYY (Wochentag), z.B. "15.01.2024 (Montag)".