Tracks
/
Elixir
Elixir
/
Übungen
/
Bibliotheksgebühren
Bibliotheksgebühren

Bibliotheksgebühren

Lernübung

Einführung

Datum und Uhrzeit

Elixirs Standardbibliothek bietet 4 verschiedene Module für die Arbeit mit Datum und Uhrzeit, jeweils mit einem eigenen Struct.

  • Das Modul Date. Ein Date-Struct kann mit dem Sigil ~D erstellt werden.

    ~D[2021-01-01]
    
  • Das Modul Time. Ein Time-Struct kann mit dem Sigil ~T erstellt werden.

    ~T[12:00:00]
    
  • Das Modul NaiveDateTime für Datum-Zeit-Werte ohne Zeitzone. Ein NaiveDateTime-Struct kann mit dem Sigil ~N erstellt werden.

    ~N[2021-01-01 12:00:00]
    
  • Das Modul DateTime für Datum-Zeit-Werte mit Zeitzone. Wenn du dieses Modul für andere Zeitzonen als UTC verwenden willst, brauchst du eine externe Abhängigkeit, eine Zeitzonendatenbank.

Vergleiche

Um Datumswerte oder Uhrzeiten miteinander zu vergleichen, suchst du im entsprechenden Modul nach einer compare- oder diff-Funktion. Vergleichsoperatoren wie ==, > und < scheinen zu funktionieren, aber sie führen keinen korrekten semantischen Vergleich für diese Structs durch.

Anleitung

Eine befreundete Bibliothekarin hat dich gebeten, ihre Bibliothekssoftware so zu erweitern, dass die Software Verspätungsgebühren automatisch berechnet. Ihr aktuelles System speichert das genaue Datum und die Uhrzeit einer Buchausleihe als einen ISO8601-Datetime-String. Die Bibliothekarin betreibt eine lokale Bibliothek in einer Kleinstadt in Ghana, die die GMT-Zeitzone (UTC +0) verwendet, keine Sommerzeit kennt und sich keine Gedanken über andere Zeitzonen machen muss.

1. Die gespeicherten Datetimes parsen

Implementiere die Funktion LibraryFees.datetime_from_string/1. Die Funktion sollte einen ISO8601-Datetime-String als Argument nehmen und eine NaiveDateTime-Struktur zurückgeben.

LibraryFees.datetime_from_string("2021-01-01T13:30:45Z")
# => ~N[2021-01-01 13:30:45]

2. Feststellen, ob ein Buch vor Mittag ausgeliehen wurde

Wenn ein Buch vor Mittag ausgeliehen wurde, hat der Leser 28 Tage Zeit, es zurückzugeben. Wurde es um oder nach Mittag ausgeliehen, sind es 29 Tage.

Implementiere die Funktion LibraryFees.before_noon?/1. Die Funktion sollte eine NaiveDateTime-Struktur nehmen und einen booleschen Wert zurückgeben.

LibraryFees.before_noon?(~N[2021-01-12 08:23:03])
# => true

3. Das Rückgabedatum berechnen

Berechne anhand des Ausleih-Datetimes das Rückgabedatum.

Implementiere die Funktion LibraryFees.return_date/1. Die Funktion sollte eine NaiveDateTime-Struktur nehmen und eine Date-Struktur zurückgeben, entweder 28 oder 29 Tage später.

LibraryFees.return_date(~N[2020-11-28 15:55:33])
# => ~D[2020-12-27]

4. Ermitteln, wie verspätet die Rückgabe des Buchs war

Die Bibliothek hat eine Pauschalgebühr für verspätete Rückgaben. Um die Gebühr berechnen zu können, müssen wir wissen, wie viele Tage nach dem Rückgabedatum das Buch tatsächlich zurückgegeben wurde.

Implementiere die Funktion LibraryFees.days_late/2. Die Funktion sollte zwei Argumente nehmen: eine Date-Struktur, das geplante Rückgabedatum, und eine NaiveDateTime-Struktur, das tatsächliche Rückgabe-Datetime.

Wenn das tatsächliche Rückgabedatum auf einen früheren oder denselben Tag fällt wie das geplante Rückgabe-Datetime, sollte die Funktion 0 zurückgeben. Andernfalls sollte die Funktion die Differenz zwischen diesen beiden Daten in Tagen zurückgeben.

Die Bibliothek erfasst sowohl das Datum als auch die Uhrzeit der tatsächlichen Rückgabe des Buchs zu statistischen Zwecken, verwendet die Uhrzeit bei der Berechnung der Verspätungsgebühren aber nicht.

LibraryFees.days_late(~D[2020-12-27], ~N[2021-01-03 09:23:36])
# => 7

5. Feststellen, ob das Buch an einem Montag zurückgegeben wurde

Die Bibliothek hat ein Sonderangebot für die Rückgabe von Büchern an Montagen.

Implementiere die Funktion LibraryFees.monday?/1. Die Funktion sollte eine NaiveDateTime-Struktur nehmen und einen booleschen Wert zurückgeben.

LibraryFees.monday?(~N[2021-01-03 13:30:45Z])
# => false

6. Die Verspätungsgebühr berechnen

Implementiere die Funktion LibraryFees.calculate_late_fee/3. Die Funktion sollte drei Argumente nehmen: zwei ISO8601-Datetime-Strings, Ausleih-Datetime und tatsächliches Rückgabe-Datetime, sowie die Verspätungsgebühr für einen Tag. Die Funktion sollte die gesamte Verspätungsgebühr zurückgeben, die sich danach richtet, wie verspätet das Buch tatsächlich zurückgegeben wurde.

Berücksichtige das spezielle Montagsangebot. Wenn du das Buch an einem Montag zurückgibst, bekommst du 50 % Rabatt auf deine Verspätungsgebühr, abgerundet.

# Sunday, 7 days late
LibraryFees.calculate_late_fee("2020-11-28T15:55:33Z", "2021-01-03T13:30:45Z", 100)
# => 700

# one day later, Monday, 8 days late
LibraryFees.calculate_late_fee("2020-11-28T15:55:33Z", "2021-01-04T09:02:11Z", 100)
# => 400
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Elixir Exercism

Bereit, mit Bibliotheksgebühren zu starten?

Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.