# Veraltet

Quelle: https://dev.inf.zone/exercises/10/outdated/

## Aufgabe

**Auf einen Blick**

- **Was:** Ein Programm, das ein Datum aus dem US-Format in das internationale Format `JJJJ-MM-TT` umwandelt.
- **Datei:** `outdated.py` in einem Ordner `outdated`.
- **Eingabe:** ein Datum nach der Aufforderung `Date: `, entweder als `9/8/1636` oder als `September 8, 1636` (mit Komma).
- **Ausgabe:** dasselbe Datum als `1636-09-08`.
- **Ungültige Eingabe:** erneut fragen, auch bei vermischten Formaten wie `October/9/1701` oder fehlendem Komma wie in `September 8 1636`. Leerzeichen am Anfang und Ende der Eingabe stören nicht: ` 9/8/1636 ` ergibt `1636-09-08`.

### So sind die Datumsformate aufgebaut

|             | Beispiel          | Aufbau                                                                   |
| ----------- | ----------------- | ------------------------------------------------------------------------ |
| **Eingabe** | `10/1/2001`       | Monat/Tag/Jahr                                                           |
| **oder**    | `October 1, 2001` | englischer Monatsname, Tag, Komma, Jahr                                  |
| **Ausgabe** | `2001-10-01`      | Jahr-Monat-Tag (ISO 8601); Monat und Tag zweistellig, bei Bedarf mit führender Null |

Gültig ist ein Datum, wenn der Monat zwischen 1 und 12 liegt bzw. einer dieser Monatsnamen ist und der Tag zwischen 1 und 31. Ob ein Monat 28, 29, 30 oder 31 Tage hat, müssen Sie nicht prüfen.

```python
[
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"
]
```

Warum das US-Format unpraktisch ist, steht am Ende der Seite unter „Zum Weiterlesen“.

## Demo

[Terminal-Aufzeichnung ansehen](https://asciinema.org/a/iPkyZlnBAjrPTE75LLhJVenUd)

## Ordner und Datei anlegen

Öffnen Sie VS Code entsprechend Ihrem [Setup](https://dev.inf.zone/extras/setup/) und legen Sie im Terminalfenster Ordner und Datei an:

```bash
cd
mkdir outdated
cd outdated
code outdated.py
```

## Hilfestellung

**Tipps**

- Ein `str` (String) in Python hat viele eingebaute Methoden, zum Beispiel `split`. Mehr dazu finden Sie in der [zugehörigen Dokumentation](https://docs.python.org/3/library/stdtypes.html#string-methods).
- Eine `list` (Liste) in Python besitzt ebenfalls verschiedene Methoden, wie etwa `index`. Details dazu stehen in der [zugehörigen Dokumentation](https://docs.python.org/3/tutorial/datastructures.html#more-on-lists).
- Wenn Sie eine Ganzzahl (`int`) mit führenden Nullen formatieren möchten, können Sie diesen Code verwenden:
  ```python
  print(f"{n:02}")
  ```
  Falls `n` nur eine Ziffer ist, wird automatisch eine führende Null hinzugefügt. Weitere Informationen zur Formatierung gibt es in der [zugehörigen Dokumentation](https://docs.python.org/3/library/string.html#format-string-syntax).

## Testen

Führen Sie zum Testen Ihres Programms `python outdated.py` aus. Geben Sie nun die folgenden _Eingaben_ ein und prüfen Sie, wie sich Ihr Programm verhält:

- **Test 1**
    - Eingabe: `9/8/1636`
    - Erwartetes Verhalten: `1636-09-08`
- **Test 2**
    - Eingabe: `September 8, 1636`
    - Erwartetes Verhalten: `1636-09-08`
- **Test 3**
    - Eingabe: `23/6/1912`
    - Erwartetes Verhalten: Ihr Programm sollte den Benutzer erneut zur Eingabe auffordern, da es sich bei der Eingabe um ein falsch formatiertes Datum handelt.
- **Test 4**
    - Eingabe: `Dezember 81, 1990`
    - Erwartetes Verhalten: Ihr Programm sollte den Benutzer erneut zur Eingabe auffordern, da es sich bei der Eingabe um ein falsch formatiertes Datum handelt.

### Korrektheit

Führen Sie in Ihrem Terminal den folgenden Befehl aus, um die Korrektheit Ihres Programms zu überprüfen. Testen Sie Ihr Programm aber zuerst manuell.

```bash
check50 -l inf-zone/exercises/2026/outdated
```

### Style

Führen Sie den folgenden Befehl aus, um den Stil Ihres Codes mit `style50` zu analysieren:

```bash
style50 outdated.py
```

## Abgeben

Geben Sie im Ordner `outdated` ab:

```bash
inf upload outdated
```

Danach sehen Sie, welche Tests Ihr Programm besteht und ob die Übung für die Bonuspunkte zählt. Wie Sie `inf` installieren und sich anmelden, steht unter [Abgeben mit `inf`](https://dev.inf.zone/faq/uebung-solutions/#inf-installieren).

## Zum Weiterlesen: Warum JJJJ-MM-TT?

Für die Lösung der Aufgabe nicht nötig.

In den USA werden Daten normalerweise in der Reihenfolge [Monat-Tag-Jahr](https://en.wikipedia.org/wiki/Date_and_time_notation_in_the_United_States) (MM/TT/JJJJ) formatiert, auch bekannt als [Middle-Endian-Reihenfolge](https://en.wikipedia.org/wiki/Endianness#Middle-endian), was ein ungünstiges Design ist. Dieses Format ist problematisch, da das Jahr am Ende steht, wodurch die Daten nicht einfach chronologisch sortiert werden können. Zum Beispiel lassen sich die Daten `2/2/1800`, `3/3/1900` und `1/1/2000` in einem beliebigen Programm (z. B. einer Tabellenkalkulation) nur sehr schwer richtig ordnen. Zudem kann das Format auch missverstanden werden: Die [Fakultät WIAI](https://www.uni-bamberg.de/wiai/ueber-die-fakultaet/geschichte/) der Universität Bamberg wurde am _October 1, 2001_ gegründet. Der _10/1/2001_ könnte aber auch als _January 10, 2001_ interpretiert werden.

Glücklicherweise verwenden Computer in der Regel [ISO 8601](https://de.wikipedia.org/wiki/ISO_8601), einen internationalen Standard, der vorschreibt, dass Datumsangaben unabhängig vom Land in der Reihenfolge Jahr-Monat-Tag (JJJJ-MM-TT) zu formatieren sind. Dabei werden Jahre mit vier Ziffern, Monate mit zwei Ziffern und Tage mit zwei Ziffern formatiert. Jede Ziffer wird nach Bedarf mit führenden Nullen "aufgefüllt".
