এলিক্সিরের স্ট্যান্ডার্ড লাইব্রেরিতে তারিখ ও সময় নিয়ে কাজ করার জন্য ৪টি ভিন্ন মডিউল আছে, যার প্রতিটির নিজস্ব স্ট্রাক্ট রয়েছে।
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]
কোনো বই দুপুরের আগে চেকআউট করা হলে পাঠকের তা ফেরত দেওয়ার জন্য ২৮ দিন সময় থাকে। আর যদি দুপুরে বা দুপুরের পরে চেকআউট করা হয়, তাহলে পাঠকের ২৯ দিন সময় থাকে।
LibraryFees.before_noon?/1 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি একটি NaiveDateTime স্ট্রাক্ট নেবে এবং একটি বুলিয়ান রিটার্ন করবে।
LibraryFees.before_noon?(~N[2021-01-12 08:23:03])
# => true
চেকআউট ডেটটাইমের ভিত্তিতে ফেরত তারিখ হিসাব করুন।
LibraryFees.return_date/1 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি একটি NaiveDateTime স্ট্রাক্ট নেবে এবং ২৮ বা ২৯ দিন পরের একটি 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 ডেটটাইম স্ট্রিং, চেকআউট ডেটটাইম এবং প্রকৃত ফেরত ডেটটাইম, এবং এক দিনের বিলম্ব ফি। এটি বইটির প্রকৃত ফেরত কত দেরিতে হয়েছিল সেই অনুযায়ী মোট বিলম্ব ফি রিটার্ন করবে।
সোমবারের বিশেষ অফারটি অন্তর্ভুক্ত করুন। আপনি যদি সোমবারে বইটি ফেরত দেন, আপনার বিলম্ব ফি ৫০% ছাড়, নিচের দিকে রাউন্ড করা।
# 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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।