Az Elixir szabványos könyvtára 4 különböző modult kínál a dátumokkal és az idővel való munkához, és mindegyiknek saját structja van.
A Date modul. Egy Date struct a ~D sigil segítségével hozható létre.
~D[2021-01-01]
A Time modul. Egy Time struct a ~T sigil segítségével hozható létre.
~T[12:00:00]
A NaiveDateTime modul az időzóna nélküli dátum-időpontokhoz. Egy NaiveDateTime struct a ~N sigil segítségével hozható létre.
~N[2021-01-01 12:00:00]
A DateTime modul az időzónával rendelkező dátum-időpontokhoz. Ha ezt a modult UTC-től eltérő időzónához használod, külső függőségre, egy időzóna-adatbázisra lesz szükséged.
Két dátum vagy idő összehasonlításához keresd a megfelelő modulban a compare vagy a diff függvényt. Az olyan összehasonlító operátorok, mint a ==, a > és a <, látszólag működnek, de ezeknél a structoknál nem végeznek helyes szemantikai összehasonlítást.
A könyvtáros barátnőd megkért, hogy bővítsd ki a könyvtári szoftverét, hogy automatikusan kiszámolja a késedelmi díjakat. A jelenlegi rendszere egy ISO8601 dátum-idő stringként tárolja a könyv kikölcsönzésének pontos dátumát és idejét. Egy kisvárosi könyvtárat vezet Ghánában, amely a GMT időzónát (UTC +0) használja, nem alkalmaz nyári időszámítást, és nem kell más időzónákkal törődnie.
Valósítsd meg a LibraryFees.datetime_from_string/1 függvényt. Bemeneti argumentumként egy ISO8601 dátum-idő stringet várjon, és adjon vissza egy NaiveDateTime structot.
LibraryFees.datetime_from_string("2021-01-01T13:30:45Z")
# => ~N[2021-01-01 13:30:45]
Ha egy könyvet dél előtt kölcsönöztek ki, az olvasónak 28 napja van visszahozni. Ha délben vagy dél után kölcsönözték ki, akkor 29 napja.
Valósítsd meg a LibraryFees.before_noon?/1 függvényt. Egy NaiveDateTime structot várjon, és adjon vissza egy logikai értéket.
LibraryFees.before_noon?(~N[2021-01-12 08:23:03])
# => true
A kikölcsönzés dátum-idője alapján számítsd ki a visszahozatali dátumot.
Valósítsd meg a LibraryFees.return_date/1 függvényt. Egy NaiveDateTime structot várjon, és adjon vissza egy Date structot, 28 vagy 29 nappal későbbre.
LibraryFees.return_date(~N[2020-11-28 15:55:33])
# => ~D[2020-12-27]
A könyvtárban egységes díj vonatkozik a késedelmes visszahozatalokra. A díj kiszámításához tudnunk kell, hogy a könyvet a visszahozatali dátum után hány nappal hozták vissza valójában.
Valósítsd meg a LibraryFees.days_late/2 függvényt. Egy Date structot, a tervezett visszahozatali dátumot, és egy NaiveDateTime structot, a tényleges visszahozatal dátum-időjét várja.
Ha a tényleges visszahozatal dátuma korábbi vagy ugyanaz a nap, mint a tervezett visszahozatali dátum-idő, a függvény adjon vissza 0-t. Ellenkező esetben a függvény adja vissza a két dátum közötti különbséget napokban.
A könyvtár statisztikai célból a könyv tényleges visszahozatalának dátumát és idejét is nyilvántartja, de a késedelmi díj kiszámításakor nem használja az időt.
LibraryFees.days_late(~D[2020-12-27], ~N[2021-01-03 09:23:36])
# => 7
A könyvtárnak különleges ajánlata van a hétfői visszahozatalokra.
Valósítsd meg a LibraryFees.monday?/1 függvényt. Egy NaiveDateTime structot várjon, és adjon vissza egy logikai értéket.
LibraryFees.monday?(~N[2021-01-03 13:30:45Z])
# => false
Valósítsd meg a LibraryFees.calculate_late_fee/3 függvényt. Három argumentumot várjon: két ISO8601 dátum-idő stringet, a kikölcsönzés dátum-időjét és a tényleges visszahozatal dátum-időjét, valamint az egy napra vonatkozó késedelmi díjat. Adja vissza a teljes késedelmi díjat annak megfelelően, hogy mennyire későn hozták vissza a könyvet.
Vedd figyelembe a különleges hétfői ajánlatot is. Ha hétfőn hozod vissza a könyvet, a késedelmi díjból 50% kedvezményt kapsz, lefelé kerekítve.
# 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
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Elixir nyelvet 58 fogalom168 feladat segítségével, valódi emberi mentorálással, mindez ingyen.