Elixir की स्टैंडर्ड लाइब्रेरी में तारीखों और समय के साथ काम करने के लिए 4 अलग-अलग मॉड्यूल हैं, और हर मॉड्यूल का अपना स्ट्रक्ट होता है।
Date मॉड्यूल। ~D सिगिल से एक Date स्ट्रक्ट बनाया जा सकता है।
~D[2021-01-01]
Time मॉड्यूल। ~T सिगिल से एक Time स्ट्रक्ट बनाया जा सकता है।
~T[12:00:00]
बिना टाइमज़ोन वाले डेटटाइम के लिए NaiveDateTime मॉड्यूल। ~N सिगिल से एक NaiveDateTime स्ट्रक्ट बनाया जा सकता है।
~N[2021-01-01 12:00:00]
टाइमज़ोन वाले डेटटाइम के लिए DateTime मॉड्यूल। UTC के अलावा दूसरे टाइमज़ोन के लिए इस मॉड्यूल का उपयोग करने पर एक बाहरी निर्भरता चाहिए, यानी टाइमज़ोन डेटाबेस।
तारीखों या समय की आपस में तुलना करने के लिए उससे जुड़े मॉड्यूल में compare या diff फंक्शन ढूँढिए। ==, > और < जैसे तुलना करने वाले ऑपरेटर काम करते लगते हैं, पर वे उन स्ट्रक्ट के लिए सही अर्थ वाली तुलना नहीं करते।
आपकी लाइब्रेरियन दोस्त चाहती है कि आप उसके लाइब्रेरी सॉफ्टवेयर में यह सुविधा जोड़ें जो विलंब शुल्क की गणना अपने आप कर सके। उसका मौजूदा सिस्टम किताब उधार देने की ठीक तारीख और समय को एक 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 स्ट्रक्ट लेना चाहिए और बूलियन लौटाना चाहिए।
LibraryFees.before_noon?(~N[2021-01-12 08:23:03])
# => true
उधार देने के डेटटाइम के आधार पर वापसी की तारीख की गणना कीजिए।
LibraryFees.return_date/1 फंक्शन बनाइए। इसे एक NaiveDateTime स्ट्रक्ट लेना चाहिए और 28 या 29 दिन बाद की एक Date स्ट्रक्ट लौटाना चाहिए।
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 स्ट्रक्ट लेना चाहिए और बूलियन लौटाना चाहिए।
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 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।