Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

रूबी टाइम और डेट क्लासेस में महारत: एक व्यापक गाइड

Time रूबी में एक क्लास है जो आपको समय में एक विशिष्ट बिंदु को दर्शाने में मदद करती है।

इस लेख को पढ़ने के बाद आप रूबी टाइम विज़ार्ड बनने के लिए आवश्यक सब कुछ सीखेंगे!

कवर किए गए विषय:

  • स्ट्रिंग्स को टाइम ऑब्जेक्ट्स में कैसे बदलें
  • टाइम को कंपोनेंट्स (दिन/घंटे/मिलीसेकंड…) में कैसे तोड़ें
  • रूबी में Date, DateTime और Time क्लासेस का उपयोग कैसे करें
  • टाइम को किसी भी तरह से फॉर्मेट कैसे करें जो आप चाहते हैं
  • दो Time ऑब्जेक्ट्स के बीच अंतर कैसे खोजें

चलिए करते हैं!

रूबी Time क्लास

आप रूबी में समय और तारीख को दर्शाने के लिए Time क्लास का उपयोग कर सकते हैं।

इस तारीख के तीन घटक हैं:

  • दिन
  • महीना
  • वर्ष

और समय:

  • घंटे
  • मिनट
  • सेकंड

यह जानकारी Time क्लास द्वारा Epoch के बाद सेकंड की संख्या के रूप में संग्रहीत की जाती है, जिसे यूनिक्स समय के रूप में भी जाना जाता है।

एक Time ऑब्जेक्ट को इनिशियलाइज़ करने के कुछ तरीके हैं:

  • आप Time.now का उपयोग करके वर्तमान समय को दर्शाने वाला ऑब्जेक्ट प्राप्त कर सकते हैं
  • आप at मेथड और एक यूनिक्स टाइमस्टैम्प का उपयोग करके एक Time ऑब्जेक्ट बना सकते हैं
  • आप Time.new को संख्या में प्रारंभिक तारीख दे सकते हैं (प्रारूप: वर्ष/महीना/दिन)

इस तरह:

 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 ऑब्जेक्ट के साथ एक टाइम ज़ोन जुड़ा होता है।

आप zone मेथड का उपयोग करके Time ऑब्जेक्ट के लिए वर्तमान टाइम ज़ोन की जांच कर सकते हैं।

यह आपको टाइम ज़ोन संक्षिप्त नाम देगा।

यदि आप टाइम ज़ोन ऑफसेट चाहते हैं तो आप utc_offset मेथड का उपयोग कर सकते हैं। इस मेथड का आउटपुट सेकंड में होता है, लेकिन आप इसे 3600 से विभाजित करके घंटों में प्राप्त कर सकते हैं।

उदाहरण:

 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 (कोऑर्डिनेटेड यूनिवर्सल टाइम) में सेकंड की संख्या है।

टाइम डिफरेंस (जोड़ और घटाव)

कभी-कभी आप वर्तमान समय नहीं चाहते, बल्कि भविष्य या अतीत में समय चाहते हैं।

आप टाइम ऑब्जेक्ट्स के साथ जोड़ कर सकते हैं!

याद रखें कि Time के लिए आंतरिक प्रतिनिधित्व सेकंड में है, इसलिए आप यह कर सकते हैं:

 # दस सेकंड जोड़ें
time = Time.new + 10 

इस उदाहरण में आपको एक टाइम ऑब्जेक्ट मिलता है जो वर्तमान समय से 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 क्लास में कुछ कॉन्स्टेंट्स हैं जो आपको उपयोगी लग सकते हैं।

उदाहरण के लिए, वर्ष के महीनों के साथ एक सरणी और सप्ताह के दिनों के साथ एक और।

महीने इंडेक्स 1 से शुरू होते हैं ताकि आप एक सीधा महीना नंबर -> महीना नाम मैपिंग प्राप्त कर सकें।

दिन रविवार से शुरू होते हैं, लेकिन आप सप्ताह को सोमवार से शुरू करने के लिए rotate मेथड का उपयोग कर सकते हैं।

 Date::MONTHNAMES # (इंडेक्स 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. रूबी मैट्रिक्स को समझना: परिभाषा, अनुप्रयोग और उन्हें कैसे बनाएं रूबी मैट्रिक्स को समझना: परिभाषा, अनुप्रयोग और उन्हें कैसे बनाएं

    मैट्रिक्स एक 2D (2-डायमेंशनल) ऐरे है जिसका उपयोग स्प्रेडशीट जैसे डेटा को स्टोर और काम करने के लिए किया जा सकता है। इनका उपयोग किया जा सकता है: टेबल गेम में बोर्ड को दर्शाना (शतरंज, चेकर्स, आदि) आंकड़े और डेटा विश्लेषण प्लॉट्स और ग्राफ़ उत्पन्न करना क्योंकि यह एक शक्तिशाली डेटा संरचना है इसलिए इसका

  1. Ruby में Alias कीवर्ड का उपयोग करके मेथड एलियास बनाना Ruby में Alias कीवर्ड का उपयोग करके मेथड एलियास बनाना

    Ruby में किसी मेथड को वैकल्पिक नाम देने के दो तरीके हैं: alias (कीवर्ड) alias_method चूंकि ये दोनों थोड़े अलग तरीके से एक ही काम करते हैं, इसलिए यह विषय भ्रमित करने वाला हो सकता है। यह छवि अंतरों का सारांश है: आइए इन अंतरों को विस्तार से समझते हैं ताकि आपको ठोस समझ मिल सके! alias कीवर्ड पहला है a

  1. रूबी स्ट्रक्ट्स और OpenStruct में महारत: कुशल वैल्यू ऑब्जेक्ट्स रूबी स्ट्रक्ट्स और OpenStruct में महारत: कुशल वैल्यू ऑब्जेक्ट्स

    रूबी में स्ट्रक्ट क्या है? एक स्ट्रक्ट एक बिल्ट-इन रूबी क्लास है, इसका उपयोग वैल्यू ऑब्जेक्ट्स उत्पन्न करने वाली नई क्लासेस बनाने के लिए किया जाता है। एक वैल्यू ऑब्जेक्ट संबंधित विशेषताओं को एक साथ संग्रहीत करने के लिए उपयोग किया जाता है। यहां एक उदाहरण है: दो निर्देशांकों (x और y) के साथ एक Point।