2010-11-12 12 views
11

रूबी की तिथि/समय सहायक मददगार हैं लेकिन मुझे एक विसंगति मिली। ऐसा लगता है कि 12. महीनों के बराबर नहीं है 1. प्रिय। 1. माह की जांच करें और आपको यह 30.days के बराबर और, निश्चित रूप से, 12 * 30.days = 360.days, वास्तविक वर्ष की लंबाई से 5.25 दिन कम होगा।रूबी में, 12. महीनों! = 1. वर्ष

जब मैं क्लाइंट द्वारा निर्दिष्ट महीनों की संख्या के आधार पर हमारी वेबसाइट के कुछ घटकों तक पहुंच सेट करता हूं, तो मैं इस पर आया था। मैंने पाया कि मेरे परीक्षण चलाने के दौरान 36. माह की अवधि समाप्त होने के कुछ हफ्तों की अवधि समाप्त हो गई। समाधान कुछ ऐसा था:

def months_to_seconds(number_of_months) 
    ((number_of_months.to_f/12) * 1.year).to_i.seconds 
end 

यह संख्या_of_months द्वारा वर्ष के किसी भी अंश में सेकंड की संख्या देता है।

चूंकि 1. वर्ष 365.25 दिनों में सेकंड के बराबर है, तो आपको लगता है कि उनके पास नहीं था 1. माह 30 दिनों के बजाय 1/12 साल के लिए सेकंड वापस कर देता है?

क्या कोई इस से पहले चला गया है? क्या किसी के पास बेहतर समाधान है?

+3

असंबद्ध, लेकिन आपको वहां 'to_f' कॉल की आवश्यकता नहीं है; बस '12.0' से विभाजित करें। इसके लिए –

उत्तर

24

कैलेंडर, और सामान्य रूप से समय, इस तरह की मनमानी चीज है और इस तरह की असंगतताओं के साथ झुका हुआ है। "महीने" की कोई मानक लंबाई नहीं है, क्योंकि भिन्नता 28 से 31 दिनों के बीच कहीं भी है, जैसे कि "दिन" की मानक लंबाई नहीं है, जो 23 से 25 घंटों तक कहीं भी हो सकती है, और यहां तक ​​कि मिनट से कहीं भी हो सकता है 59 से 62 सेकंड जब "लीप सेकंड" खाते में लिया जाता है। इसी तरह एक वर्ष 3682 या 366 दिन या 3582 के मामले में भी 351 हो सकता है।

जब तक आप एक विशेष अंतराल के लिए विशिष्ट गणना नहीं कर रहे हैं, जैसे 3 जनवरी, 2010 और 1 9 अक्टूबर के बीच सेकंड की संख्या, 2011, आप यह जानने में सक्षम नहीं होंगे कि अंतराल महीनों, दिनों या वर्षों का उपयोग कितना समय तक कर रहा है। ये चीजें कारकों की एक बड़ी संख्या पर निर्भर हैं।

आपका समाधान आपके आवेदन के लिए उपयुक्त है, लेकिन रेल में शब्दों में "माह" सरलता के लिए केवल 30 दिन है, जैसे "दिन" 24 घंटे है।

+3

+ 1। हमारे ऐप के लिए कुछ तर्क कोड करते समय हम ओपी के समान मुद्दों में भाग गए। असल में आपको यह महसूस करना होगा कि दुर्भाग्यवश समय की इकाइयां अपनी प्रकृति के कारण नहीं बढ़ती हैं, इसलिए यदि आप रूपांतरण साप्ताहिक, मासिक गणना या कुछ कर रहे हैं, तो आपको बस स्वीकार करना होगा कि चीजें एक होगी सन्निकटन और एक सतत रूपांतरण विधि का उपयोग करें (उदाहरण के लिए हमेशा पहले दिनों में कनवर्ट करें) – Jeremy

+1

यह दुख की बात है कि एक सेकंड एक मिनट का 1/60 भी नहीं है। उन सीज़ियम परमाणुओं को डांगो और हल्की यात्रा से तेज़ करें। –

0

1 वर्ष 12 अलग-अलग महीनों से बना है, लेकिन उनमें से कई महीने अलग-अलग आकार हैं। यह देखते हुए कि एक महीने वास्तव में 28, 2 9, 30, या 31 कैलेंडर दिन हो सकता है, यह उम्मीद करना उचित है कि एक महीने की लंबाई की किसी भी परिभाषा को वह नहीं हो सकता है जो कोई चाहता है।

व्यक्तिगत रूप से, मैं ज्यादातर मामलों में एक महीने की परिभाषा के रूप में 4 सप्ताह का उपयोग करता हूं। इस मामले में, जहां आप "एक महीने" के लिए पहुंच प्रदान कर रहे हैं, मैं महीने के उपयोग के दिन को स्टोर करने के इच्छुक हूं। फिर, माह संख्या लें और महीने के उसी दिन एन महीने संख्या के समाप्ति पर समाप्ति करें।

+0

दूसरे शब्दों में, किसी भी चीज़ के लिए महीने की लंबाई/लंबाई का उपयोग न करें; महीने की संख्या का उपयोग करें। – dannysauer

0
require 'date' 

expire_date = Date.today >> 36 
puts expire_date #=> 2013-11-12 

आप, महीने घटाना < < उपयोग करना चाहते हैं।

8

हाँ और नहीं:

12 months, 1 year जब आप उन्हें रिश्तेदार अंतराल के रूप में उपयोग के रूप में ही कर रहे हैं, क्योंकि वे तो सेकंड में बदला नहीं जाता:

t = Time.now 
#=> 2010-11-12 22:34:57 0100 
t - 1.year == t - 12.months 
#=> true 

आंतरिक रूप से, इन अंतराल सरणियों के रूप में रखा जाता है वर्ष, महीनों और दिनों की संख्या की, इसलिए यदि आप उदाहरण के लिए कहते हैं,:

1.year - 12.months 
#=> 1 year and -12 months 

इसका मतलब है कि घटाव एक में हुई अंतराल "एक वर्ष और शून्य 12 महीने" शामिल है।

लेकिन यदि आप to_i उन्हें, तो उन्हें सेकंड की सटीक मात्रा में परिवर्तित करने की आवश्यकता है, और किसी ने फैसला किया है कि "एक महीने" का अर्थ है "30 दिन", जो कि किसी अन्य के रूप में अच्छा अनुमान है, जबकि आप इसके साथ रहते हैं।

डॉक्स में बताया है कि:

जब ऊपर उदाहरण में के रूप में इस्तेमाल करते हुए इन तरीकों सटीक गणना प्रदान करते हैं देखभाल लिया जाना चाहिए ध्यान दें कि यह सच नहीं है, तो के परिणाम 'महीने', '' साल, आदि उपयोग

से पहले बदल जाती है मुझे लगता है कि इन अंतराल के रूप में "lazily का मूल्यांकन" एक तरह से देखा जा सकता है।

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