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 টাইম এক্সটেনশন ব্যবহার সম্পর্কে শিখেছেন।
পড়ার জন্য ধন্যবাদ!