Η βασική βιβλιοθήκη της Elixir προσφέρει 4 διαφορετικά modules για να δουλεύεις με ημερομηνίες και ώρα, καθένα με το δικό του struct.
Το module Date. Ένα struct Date μπορεί να δημιουργηθεί με το sigil ~D.
~D[2021-01-01]
Το module Time. Ένα struct Time μπορεί να δημιουργηθεί με το sigil ~T.
~T[12:00:00]
Το module NaiveDateTime για ημερομηνίες και ώρες χωρίς ζώνη ώρας. Ένα struct NaiveDateTime μπορεί να δημιουργηθεί με το sigil ~N.
~N[2021-01-01 12:00:00]
Το module DateTime για ημερομηνίες και ώρες με ζώνη ώρας. Η χρήση αυτού του module για ζώνες ώρας άλλες από UTC απαιτεί μια εξωτερική εξάρτηση, μια βάση δεδομένων ζωνών ώρας.
Για να συγκρίνεις ημερομηνίες ή ώρες μεταξύ τους, ψάξε για μια συνάρτηση compare ή diff στο αντίστοιχο module. Οι τελεστές σύγκρισης όπως οι ==, > και < φαίνεται να δουλεύουν, αλλά δεν κάνουν σωστή σημασιολογική σύγκριση για αυτά τα struct.
Η φίλη σου η βιβλιοθηκάριος σου ζήτησε να επεκτείνεις το λογισμικό της βιβλιοθήκης της, ώστε να υπολογίζει αυτόματα τα πρόστιμα καθυστέρησης. Το τρέχον σύστημά της αποθηκεύει την ακριβή ημερομηνία και ώρα του δανεισμού ενός βιβλίου ως συμβολοσειρά ημερομηνίας και ώρας ISO8601. Διευθύνει μια τοπική βιβλιοθήκη σε μια μικρή πόλη της Γκάνας, η οποία χρησιμοποιεί τη ζώνη ώρας GMT (UTC +0), δεν εφαρμόζει θερινή ώρα και δεν χρειάζεται να ανησυχεί για άλλες ζώνες ώρας.
Υλοποίησε τη συνάρτηση LibraryFees.datetime_from_string/1. Θα πρέπει να δέχεται ως όρισμα μια συμβολοσειρά ημερομηνίας και ώρας ISO8601 και να επιστρέφει μια δομή NaiveDateTime.
LibraryFees.datetime_from_string("2021-01-01T13:30:45Z")
# => ~N[2021-01-01 13:30:45]
Αν ένα βιβλίο δανείστηκε πριν το μεσημέρι, ο αναγνώστης έχει 28 ημέρες για να το επιστρέψει. Αν δανείστηκε το μεσημέρι ή αργότερα, έχει 29 ημέρες.
Υλοποίησε τη συνάρτηση LibraryFees.before_noon?/1. Θα πρέπει να δέχεται μια δομή NaiveDateTime και να επιστρέφει μια boolean τιμή.
LibraryFees.before_noon?(~N[2021-01-12 08:23:03])
# => true
Με βάση την ημερομηνία και ώρα δανεισμού, υπολόγισε την ημερομηνία επιστροφής.
Υλοποίησε τη συνάρτηση LibraryFees.return_date/1. Θα πρέπει να δέχεται μια δομή NaiveDateTime και να επιστρέφει μια δομή Date, 28 ή 29 ημέρες αργότερα.
LibraryFees.return_date(~N[2020-11-28 15:55:33])
# => ~D[2020-12-27]
Η βιβλιοθήκη έχει ενιαία χρέωση για τις καθυστερημένες επιστροφές. Για να μπορέσουμε να υπολογίσουμε το πρόστιμο, πρέπει να ξέρουμε πόσες ημέρες μετά την ημερομηνία επιστροφής επιστράφηκε στην πραγματικότητα το βιβλίο.
Υλοποίησε τη συνάρτηση LibraryFees.days_late/2. Θα πρέπει να δέχεται μια δομή Date, την προγραμματισμένη ημερομηνία επιστροφής, και μια δομή NaiveDateTime, την πραγματική ημερομηνία και ώρα επιστροφής.
Αν η πραγματική ημερομηνία επιστροφής είναι προγενέστερη ή ίδια με την προγραμματισμένη ημερομηνία και ώρα επιστροφής, η συνάρτηση θα πρέπει να επιστρέφει 0. Διαφορετικά, η συνάρτηση θα πρέπει να επιστρέφει τη διαφορά μεταξύ των δύο αυτών ημερομηνιών σε ημέρες.
Η βιβλιοθήκη καταγράφει και την ημερομηνία και την ώρα της πραγματικής επιστροφής του βιβλίου για στατιστικούς σκοπούς, αλλά δεν χρησιμοποιεί την ώρα κατά τον υπολογισμό των προστίμων καθυστέρησης.
LibraryFees.days_late(~D[2020-12-27], ~N[2021-01-03 09:23:36])
# => 7
Η βιβλιοθήκη έχει μια ειδική προσφορά για την επιστροφή βιβλίων τις Δευτέρες.
Υλοποίησε τη συνάρτηση LibraryFees.monday?/1. Θα πρέπει να δέχεται μια δομή NaiveDateTime και να επιστρέφει μια boolean τιμή.
LibraryFees.monday?(~N[2021-01-03 13:30:45Z])
# => false
Υλοποίησε τη συνάρτηση LibraryFees.calculate_late_fee/3. Θα πρέπει να δέχεται τρία ορίσματα: δύο συμβολοσειρές ημερομηνίας και ώρας ISO8601, την ημερομηνία και ώρα δανεισμού και την πραγματική ημερομηνία και ώρα επιστροφής, και το πρόστιμο καθυστέρησης για μία ημέρα. Θα πρέπει να επιστρέφει το συνολικό πρόστιμο καθυστέρησης, ανάλογα με το πόσο καθυστέρησε η πραγματική επιστροφή του βιβλίου.
Συμπερίλαβε την ειδική προσφορά της Δευτέρας. Αν επιστρέψεις το βιβλίο Δευτέρα, το πρόστιμο καθυστέρησης έχει έκπτωση 50%, στρογγυλοποιημένη προς τα κάτω.
# 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
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Elixir με 58 έννοιες168 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.