কম্পিউটার টিউটোরিয়াল

রুবি Time এবং Date ক্লাস মাস্টার করুন: একটি বিস্তারিত গাইড

Time হলো রুবিতে একটি ক্লাস যা একটি নির্দিষ্ট সময় পয়েন্ট রিপ্রেজেন্ট করতে সাহায্য করে।

এই আর্টিকেল পড়ার পর আপনি রুবি টাইম উইজার্ড बनতে আপনার যা যা জানতে হবে সেটা শিখে যাবেন!

কভার করা টপিক:

  • স্ট্রিংকে টাইম অবজেক্টে কনভার্ট করা
  • একটি টাইমকে কম্পোনেন্টে ভাগ করা (দিন/আওয়ার/মিলিসেকেন্ড…)
  • রুবিতে Date, DateTime এবং Time ক্লাস ব্যবহার
  • টাইমকে যেকোনো ফরম্যাটে ফরম্যাট করা
  • দুটি Time অবজেক্টের মধ্যে পার্থক্য খুঁজে বের করা

চলুন শুরু করি!

রুবি Time ক্লাস

আপনি রুবিতে একটি টাইম এবং ডেট রিপ্রেজেন্ট করতে Time ক্লাস ব্যবহার করতে পারেন।

এই ডেট-এর তিনটি কম্পোনেন্ট রয়েছে:

  • দিন
  • মাস
  • বছর

এবং টাইম:

  • ঘন্টা
  • মিনিট
  • সেকেন্ড

এই ইনফরমেশন Time ক্লাস দ্বারা Epoch-এর পর থেকে সেকেন্ডের সংখ্যা হিসেবে সংরক্ষিত থাকে, যাকে ইউনিক্স টাইমও বলা হয়।

Time অবজেক্ট ইনিশিয়ালাইজ করার কয়েকটি পদ্ধতি রয়েছে:

  • আপনি বর্তমান টাইম রিপ্রেজেন্ট করে একটি অবজেক্ট পেতে পারেন Time.now ব্যবহার করে
  • আপনি একটি ইউনিক্স টাইমস্ট্যাম্প এবং at মেথড ব্যবহার করে একটি Time অবজেক্ট তৈরি করতে পারেন
  • আপনি Time.new-এ নাম্বারে শুরুর ডেট দিতে পারেন (ফরম্যাট: year/month/day)

যেন:

 Time.now # 2018-10-19 15:43:20 +0200 Time.new(2018, 1, 1) # 2018-01-01 00:00:00 +0100 Time.at(15000000000) # 2017-07-14 04:40:00 +0200 

আপনি একটি টাইম অবজেক্ট থেকে এর যেকোনো কম্পোনেন্ট জিজ্ঞেস করতে পারেন।

উদাহরণস্বরূপ…

আপনি জিজ্ঞেস করতে পারেন একটি টাইম অবজেক্ট কোন দিন, মাস বা ঘন্টা রিপ্রেজেন্ট করছে:

 t = Time.now puts t.day puts t.month puts t.hour 

অতিরিক্তভাবে, আপনি এটি চেক করতে পারেন এই ডেট কোন নির্দিষ্ট দিনের সাথে মিলে কিনা।

উদাহরণস্বরূপ:

“এই ডেটটি কি সানডে?”।

এগুলো প্রেডিকেট মেথড, এগুলো true বা false রিটার্ন করবে।

উদাহরণ:

 t = Time.now puts t.monday? puts t.sunday? puts t.friday? 

ট্রাই করুন!

টাইম জোন

একটি Time অবজেক্টের সাথে একটি টাইম জোন জড়িত থাকে।

আপনি একটি Time অবজেক্টের বর্তমান টাইম জোন চেক করতে পারেন zone মেথড ব্যবহার করে।

এটি আপনাকে টাইম জোনের সংক্ষিপ্ত রূপ দেবে।

আপনি যদি টাইম জোন অফসেট চান তবে utc_offset মেথড ব্যবহার করতে পারেন। এই মেথডের আউটপুট সেকেন্ডে থাকে, কিন্তু আপনি ৩৬০০ দিয়ে ভাগ করে আওয়ারে পেতে পারেন।

উদাহরণ:

 t = Time.now t.zone # "CET" t.utc_offset / 3600 # 1 

আপনি বর্তমান টাইম UTC-এও পেতে পারেন:

 Time.now.utc 

রুবি টাইম ফরম্যাটিং

রুবি Time অবজেক্টকে একটি নির্দিষ্ট পদ্ধতিতে ফরম্যাট করে ডিফল্টভাবে।

কিন্তু আপনি অন্য কিছু চাইতে পারেন।

যে আপনার ইউজ কেসের সাথে অ্যাডাপ্ট করে।

খুশির খবর!

আপনি একটি মেথড ব্যবহার করে প্রায় যেকোনো ফরম্যাট পেতে পারেন।

এই মেথডটি হলো strftime, যা বেসিক্যালি মানে ‘ফরম্যাট টাইম’।

এটি একটি স্ট্রিংয়ের সাথে ফরম্যাট স্পেসিফায়ার পাস করে কাজ করে, এই স্পেসিফায়ারগুলো একটি ভ্যালু দিয়ে রিপ্লেস হয়। আপনি যদি কখনো printf মেথড ব্যবহার করে থাকেন তবে আইডিয়া খুব সিমিলার।

কয়েকটি উদাহরণ দেখি:

 time = Time.new time.strftime("%d/%m/%Y") # "05/12/2015" time.strftime("%k:%M") # "17:48" time.strftime("%I:%M %p") # "11:04 PM" time.strftime("Today is %A") # "Today is Sunday" time.strftime("%d of %B, %Y") # "21 of December, 2015" time.strftime("Unix time is %s") # "Unix time is 1449336630" 

আপনি দেখতে পাচ্ছেন, এই মেথডটি খুব ফ্লেক্সিবল। আপনি ডেট ছাড়া টাইম পেতে পারেন, বা বছর, দিন এবং বর্তমান মাসের নাম সহ একটি সুন্দর ফরম্যাটেড ডেট।

Strftime ফরম্যাট টেবিল

ফরম্যাট বিবরণ
%d মাসের দিন (01..31)
%m বছরের মাস (01..12) (1..12) এর জন্য %-m ব্যবহার করুন
%k আওয়ার (0..23)
%M মিনিট
%S সেকেন্ড (00..60)
%I আওয়ার (1..12)
%p AM/PM
%Y বছর
%A সপ্তাহের দিন (নাম)
%B মাস (নাম)

আপনি নিচের লিংকগুলোতে বিভিন্ন ফরম্যাট সম্পর্কে আরও তথ্য পাবেন:

  • https://strftime.net/
  • https://devdocs.io/ruby/time#method-i-strftime

টাইমস্ট্যাম্প জেনারেট করা

আপনি একটি টাইম-জোন-ইনডিপেনডেন্ট টাইমস্ট্যাম্প জেনারেট করতে পারেন নির্দিষ্ট ইভেন্ট ডেট করার জন্য।

পদ্ধতি:

 Time.now.to_i # 1549054305 

এই টাইমস্ট্যাম্প UTC (Coordinated Universal Time)-এ সেকেন্ডের একটি সংখ্যা।

টাইম পার্থক্য (যোগ এবং বিয়োগ)

কখনো কখনো আপনি বর্তমান টাইম না চাইলে ভবিষ্যত বা অতীতে একটি টাইম চান।

আপনি টাইম অবজেক্টের সাথে যোগ করতে পারেন!

মনে রাখবেন Time-এর ইন্টারন্যাল রিপ্রেজেন্টেশন সেকেন্ডে, তাই আপনি এভাবে করতে পারেন:

 # দশ সেকেন্ড যোগ করুন time = Time.new + 10 

এই উদাহরণে আপনি একটি টাইম অবজেক্ট পাবেন যা বর্তমান টাইম থেকে ১০ সেকেন্ড পরে সেট করা আছে।

তারপর আপনি চেক করতে পারেন সেই টাইমটি কি ইতিমধ্যে পাস হয়েছে।

 Time.new > time 

আপনি যদি গতকালের দিনের মত কিছু চান তবে আপনাকে ক্যালকুলেট করতে হবে এক দিনে কত সেকেন্ড থাকে।

যেন:

 # সেকেন্ড * মিনিট * আওয়ার 60 * 60 * 24 # 86400 

এখন এই নাম্বার দিয়ে বর্তমান ডেট থেকে বিয়োগ করুন:

 Time.now - 86400 

আপনি যদি রেইলস ব্যবহার করেন তবে আপনি এভাবে করতে পারেন:

 Time.now - 1.day 

Date ক্লাস

Date ক্লাসের মিনিট, সেকেন্ড বা আওয়ার কোনো ধারণা নেই। এই ক্লাস সব কিছু ইন্টারন্যালি দিনের টার্মে সংরক্ষণ করে।

Date ক্লাস ব্যবহার করতে আপনাকে require 'date' করতে হবে।

আপনি বর্তমান ডেট পেতে পারেন Date.today ব্যবহার করে।

Time-র মতো Date.new today-এর আলিয়াস নয়, তাই সেটা মনে রাখবেন।

 Date.today # বর্তমান ডেট Date.new # একটি 네가টিভ ডেট রিটার্ন করে 

Date এর অ্যারিথমেটিক Time ক্লাসের মতো, পার্থক্য হলো আপনি সেকেন্ডের বদলে দিন যোগ করবেন।

 Date.today + 1 # এক দিন যোগ করে 

একটি Date আওয়ার, সেকেন্ড বা মিনিটের কোনো জ্ঞান রাখে না, তাই শুধু এই ক্লাসটি ব্যবহার করুন যদি আপনার এগুলো দরকার না হয়।

Date & Time পার্সিং

Date.parse মেথড যেকোনো স্ট্রিং যা ডেটের মতো দেখে তা পার্স করার চেষ্টা করবে।

এটি একটি সিম্পল হিউরিস্টিক্যাল অ্যালগরিদম ব্যবহার করে ইনপুট ফরম্যাট ডিটেক্ট করতে।

কখনো কখনো এটি অপ্রত্যাশিত ফলাফল দেয়।

উদাহরণ:

 Date.parse("10/10/2010") # -> 2010-10-10 Date.parse("September 3") # -> 2015-09-03 Date.parse("May I have a cup of coffee, please?") # -> 1 of May 

আপনি যদি কিছু বেশি স্ট্রিক্ট কিছু চান তবে আপনি Date.iso8601 মেথড ব্যবহার করতে পারেন।

একটি iso8601 ডেটের নিচের ফরম্যাট থাকে:

 year-month-day 

ইনভ্যালিড ইনপুটে ArgumentError এক্সেপশন থ্রো হবে।

উদাহরণ:

 Date.iso8601("2018-10-01") 

আপনি Date.strptime মেথড এবং ফরম্যাট স্পেসিফায়ার সেট ব্যবহার করে আপনার নিজস্ব কাস্টম ইনপুট ফরম্যাট দিতে পারেন। এগুলো সেম স্পেসিফায়ার যেগুলো আপনি strftime-এ ব্যবহার করতে পারেন।

উদাহরণ:

 Date.strptime("3 of September", "%d of %B") # 2015-09-03 

আপনি Time ক্লাস ব্যবহার করে টাইম পার্স করতে পারেন।

অন্য কথায়:

‘2018-01-01 00:00’ যেন একটি স্ট্রিংকে Time অবজেক্টে কনভার্ট করবেন!

এখানে একটি উদাহরণ:

 require 'time' Time.parse("September 20 18:00") 

আপনি যদি আপনার ইনপুট স্ট্রিংয়ের ফরম্যাট প্রদান করতে চান তবে আপনি strptime মেথড ব্যবহার করতে পারেন।

যেন:

 require 'time' Time.strptime("1 of December 2017", "%d of %B %Y") 

Time.parse এবং Date.parse-এর একমাত্র পার্থক্য হলো আপনি কী টাইপের অবজেক্ট ফিরে পাচ্ছেন (Time বা Date)।

Date কনস্ট্যান্টস

Date ক্লাসের কিছু কনস্ট্যান্ট রয়েছে যা আপনি উপকারী পেতে পারেন।

উদাহরণস্বরূপ, বছরের মাসগুলো এবং সপ্তাহের দিনগুলো সম্বলিত একটি অ্যারে রয়েছে।

মাসগুলো ইনডেক্স ১ থেকে শুরু হয় তাই আপনি সরাসরি month number -> month name ম্যাপিং পেতে পারেন।

দিনগুলো সানডে দিয়ে শুরু হয়, কিন্তু আপনি rotate মেথড ব্যবহার করে সপ্তাহকে ম্যানডে দিয়ে শুরু করতে পারেন।

 Date::MONTHNAMES # (index 0 = nil) Date::DAYNAMES.rotate(1) 

DateTime ক্লাস

DateTime ক্লাস Date-এর সাবক্লাস এবং এটি ডেটের পাশাপাশি সেকেন্ডও স্টোর করতে পারে।

উদাহরণ:

 require 'date' DateTime.superclass # Date DateTime.now # DateTime: 2018-10-15T16:06:39+02:00 

Time এবং DateTime দুটোই একই কাজ করতে পারে, মূল পার্থক্য হলো Time C-তে ইমপ্লিমেন্টেড, তাই এটি ফাস্টার হবে।

পারফরম্যান্স:

 Comparison: Time: 2644596.6 i/s DateTime: 231634.8 i/s - 11.42x slower 

ActiveSupport – Time & Date মেথডস

আপনি যদি রেইলস ব্যবহার করে থাকেন তবে আপনি নিশ্চয়ই 3.days.ago এর মতো জিনিসগুলো থেকে পরিচিত।

এই মেথডগুলো পিউর রুবিতে উপলব্ধ নয়, এগুলো রেইলসের ActiveSupport কম্পোনেন্টে যোগ করা হয়েছে।

এখানে কিছু উদাহরণ, লক্ষ্য করুন এই মেথডগুলো Time বা Date অবজেক্ট রিটার্ন করে না, বরং একটি কাস্টম ActiveSupport ক্লাস রিটার্ন করে।

 1.hour.to_i # 3600 1.day # ActiveSupport::Duration 3.days.ago # ActiveSupport::TimeWithZone 

আপনি এই সাথে টাইম ম্যাথ করতে পারেন এবং কালের ডেটের মত জিনিস পেতে পারেন:

 Time.now + 1.day 

অন্যান্য রেইলস-এক্সক্লুসিভ টাইম মেথড:

 date = Time.current date.change(hour: 20) date.at_beginning_of_day 

এবং ফরম্যাটিংয়ের জন্য:

 date = Date.today date.to_formatted_s(:short) # "16 Jul" date.to_formatted_s(:long) # "July 16, 2018" 

এই মেথডগুলোর কোড আসলে খুব সিম্পল, আপনাকে এক নজর দিতে পারেন। TimeWithZone-এর সোর্স কোডও দেখতে লायक।

সারাংশ

এই আর্টিকেলে আপনি Time এবং Date ক্লাস সম্পর্কে, রুবিতে টাইম পার্স এবং ফরম্যাট করা, এবং ActiveSupport টাইম এক্সটেনশন ব্যবহার সম্পর্কে শিখেছেন।

পড়ার জন্য ধন্যবাদ!


  1. রুবিতে Rake মাস্টার করুন: টাস্ক অটোমেশন-এর সম্পূর্ণ গাইড

  2. রুবি ম্যাট্রিক্স বুঝতে: ডেফিনিশন, অ্যাপ্লিকেশন এবং কীভাবে তৈরি করবেন

  3. রুবি মাস্টারিং: মেথড এলিয়াস তৈরি করার জন্য Alias কিওয়ার্ড ব্যবহার

  4. রুবি Struct ও OpenStruct: দক্ষ ভ্যালু অবজেক্টস