2016-03-23 11 views
7

क्या मैं रेलों को सेकंड में अपनी गणना के लिए एक ही तर्क लागू कर सकता हूं क्योंकि यह वर्षों में मेरी गणना के लिए करता है?रेल में, 1.year.from_now क्यों नहीं है 1.year.to_i.seconds.from_now?

puts "#{1.year.from_now} | #{1.year.to_i.seconds.from_now}" 
2017-03-23 18:48:06 UTC | 2017-03-24 00:48:06 UTC 

मुझे समझ में नहीं आता कि 6 घंटे का अंतर कहां से आता है।

+0

आप रेल का किस संस्करण का उपयोग कर रहे हैं? मुझे दोनों के लिए एक ही चीज़ मिल रही है। – omarvelous

+0

4.2.1 पर था। बस 4.2.6 तक अपग्रेड करने का प्रयास किया, और मुझे एक ही आउटपुट मिलता है। – djb

उत्तर

9

अंतर 6 घंटे है। वास्तविक 6 घंटे का अंतर है

>> 1.year.to_i/60/60/24.0 
=> 365.25 

उन 0.25 दिनों: और यह क्योंकि सेकंड में 1 वर्ष (के रूप में to_i विधि द्वारा परिवर्तित) 365.25 दिनों रूबी ऑन रेल्स कोर एक्सटेंशन में के रूप में परिभाषित किया जाता है। ऐसा करने से, आरओआर लीप वर्षों में गिनने की कोशिश कर रहा है (basic approximation द्वारा) 4 वर्षों में एक बार होता है। में years परिभाषा से भी यह स्पष्ट है।

दूसरी ओर 1.year.from_now इसके बजाय एक ठोस कैलेंडर डेटाटाइम की एक शिफ्ट करता है। जैसे कि आपने अपनी दीवार कैलेंडर पर पेज बदल दिए हैं।

+1

धन्यवाद। रिकॉर्ड के लिए, मैं एक टेबल में सेकंड में अवधि संग्रहीत कर रहा था और जब मैं इसका इस्तेमाल करता था तो समझदारी से इसे लागू करना चाहता था। मुझे महीनों से अधिक सटीकता की आवश्यकता नहीं है, इसलिए मैंने '(अवधि .to_i/1.month.to_i) .months.from_now' के साथ समाप्त हो गया है। – djb

+0

यह भयानक है। जानना अच्छा है, और महान जवाब है, लेकिन अभी भी भयानक है। –

+0

@ मैट क्यों? यह मेरे लिए काफी उचित लगता है क्योंकि '1. वर्ष' अभिव्यक्ति का मतलब केवल एक अमूर्त समय है जो किसी ठोस तारीख और समय से संबंधित नहीं है। तो रूबी लीप वर्षों के लिए खाते की कोशिश करता है जो आमतौर पर 4 वर्षों में एक बार होता है। यदि यह ऐसा नहीं कर रहा था (यदि '1.year' केवल' 365.days' के बराबर होगा) लंबी अवधि की अभिव्यक्ति की तुलना में गंभीरता से गलत होगा, उदा। 'अब + 10. साल' 2 दिनों से बंद हो सकता है। – BoraMa

संबंधित मुद्दे