2012-04-07 7 views
21

में समय मैनिपुलेशन मैं एक डेटटाइम उदाहरण बनाना चाहता हूं जो भविष्य में 20 मिनट और 10 सेकंड है। मैंने आईआरबी में टाइम और डेटटाइम के साथ चारों ओर कोशिश की, लेकिन ऐसा लगता है कि वास्तव में समझ में आता है। मैं केवल डेटटाइम ऑब्जेक्ट्स में दिन जोड़ सकता हूं और केवल समय ऑब्जेक्ट में सेकंड जोड़ सकता हूं।रूबी

क्या समय को हमेशा सेकंड में जोड़ने के लिए बेहतर तरीका नहीं है?

उत्तर

46

Time कई सेकंड पाप है सीई एक युग जबकि DateTime एक युग के बाद से कई दिनों के लिए है, इसलिए 1 को DateTime में जोड़ने का एक पूरा दिन जोड़ता है। आप फिर भी उदाहरण

d = DateTime.now 
d + Rational(10, 86400) 

के लिए एक दिन के भिन्न जोड़ सकते हैं, (के बाद से वहाँ एक दिन में 86400 सेकंड कर रहे हैं) d करने के लिए 10 सेकंड जोड़ने जाएगा।

आप रेल का उपयोग कर रहे हैं, तो ActiveSupport कुछ सहायक तरीकों कहते हैं और आप कर सकते हैं

d + 20.minutes + 10.seconds 

कौन सा सही काम करेंगे d एक DateTime या एक Time है। आप अपने आप ActiveSupport का उपयोग कर सकते हैं, और इन दिनों आप केवल बिट्स को खींच सकते हैं। मुझे याद है कि यह सामान activesupport/duration में है। मेरा मानना ​​है कि कुछ अन्य रत्न भी हैं जो समय प्रबंधन के साथ भी मदद करते हैं।

+5

व्यक्तिगत रूप से मैं इसे थोड़ा और स्पष्ट बनाने के लिए '60 * 60 * 24' लिखना पसंद करता हूं जहां जादू संख्या आई थी, भले ही यह रनटाइम पर बहुत धीमी गति से हो। –

+0

@AndrewMarshall सहमत हुए, और जब तक कि यह लाखों बार लाखों बार इस 'डेटटाइम' मैनिपुलेशन को निष्पादित नहीं कर रहा है, तो दो और गुणात्मक संचालन * माइक्रो-ऑप्टिमाइज़िंग * के लायक नहीं हैं। जब तक आप प्रदर्शन समस्या में भाग नहीं लेते तब तक इसके बारे में भी मत सोचें।इससे भी बेहतर, कोड की शुरुआत में निरंतर घोषित करने के बारे में कैसे? 'SECONDS_PER_DAY = 60 * 60 * 24', और इसका उपयोग करें। 'MINUTERS_PER_DAY = 60 * 24' और' HOURS_PER_DAY = 24' के लिए भी किया जा सकता है, हालांकि शायद आखिरी व्यक्ति जरूरी नहीं है, लेकिन यह सुसंगत होना और केवल उन सभी को सूचीबद्ध करना अच्छा है। –

2

ठीक है, इंटरफ़ेस सरल और सीधा है:

t = Time.now 
t + (20 * 60 + 10) 

आप कुछ सुविधाजनक करना चाहते हैं, तो आप Time वर्ग के लिए तरीकों जोड़ सकते हैं:

class Time 
    def add_minutes(m) 
    self + (60 * m) 
    end 
end 

लेकिन मुझे नहीं लगता कि यह आसान है:

t = Time.now 
t.add_minutes(20) + 10 
+4

ओपी डेटटाइम चाहता है, समय नहीं। – steenslag

2

मान लें कि आपको ActiveSupport की आवश्यकता है या आप रेल परियोजना में काम कर रहे हैं। एक बहुत ही सरल एक पठनीय माणिक में ऐसा करने का तरीका है:

DateTime + 5.minutes 
Time + 5.minutes 

इसके अलावा .seconds, .hours, .days, .weeks, .month, .years

+16

कृपया ध्यान दें कि यह मानता है कि आपके पास ActiveSupport या Rails हैं। –

+0

जानकारी के लिए धन्यवाद - मैंने सोचा कि यह रूबी मानक व्यवहार है – alex

2

साथ काम करता है बस सक्रिय समर्थन समय एक्सटेंशन का उपयोग। वे हाथ से ऐसा करने की कोशिश करने से बहुत सुविधाजनक और कम त्रुटि प्रवण हैं। तुम बस मॉड्यूल आयात कर सकते हैं आप की जरूरत:

# gem 'activesupport' 
require 'active_support/core_ext/numeric/time.rb' 
DateTime.now + 20.minutes 

एनबी: हाँ, यह 3 पार्टी पुस्तकालयों से दूर रहने की StackOverflow पार्टी लाइन के खिलाफ जाता है, लेकिन आप लाइब्रेरी का उपयोग कर जब वे कर रहे हैं से बचने के नहीं करना चाहिए व्यावहारिक रूप से मानक, अपने जोखिम को काफी कम करें, और बेहतर कोड स्पष्टता प्रदान करें।