2010-06-16 6 views
34

मुझे लगता है कि कोई मुझे किसी अन्य प्रश्न पर इंगित करने जा रहा है जो इसका उत्तर देता है लेकिन मैं इस साधारण मुद्दे पर कोई भाग्य नहीं खोज रहा हूं।दिनों में अंतर की गणना करें ActiveSupport: TimeWithZone सबसे अधिक "रूबीश" शैली में?

मेरे पास डेटाटाइम संपत्ति वाला एक्टिव्रेकॉर्ड है। यह एक ActiveSupport: TimeWithZone के रूप में लौटाता है। मुझे पता है कि मैं इसकी तुलना डेटटाइम से नहीं कर सकता। अब क्योंकि इसमें ज़ोन शामिल नहीं है इसलिए मुझे Time.zone का उपयोग करने की आवश्यकता है। समझ में आता है।

जो मैं सोच रहा हूं वह शैली की दिशा में 86400 तक परिणाम घटाने और विभाजित करने से ऐसा करने के लिए "क्लीनर" तरीका है?

यहाँ मैं क्या करना है:

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i 

वर्क्स लेकिन लगता है अन-rubyish और मुझे लगता है कि मैं कुछ याद कर रहा हूँ। क्या मुझे कुछ अन्य मार्गों का कास्टिंग, तुलना या रूपांतरण करना चाहिए या क्या यह वास्तव में रेल में ऐसा करने का सामान्य तरीका है? किसी भी सुझाव या किसी प्रश्न के लिंक की सराहना करें जो पहले से ही इसे कवर करता है।

धन्यवाद

+0

आप उत्पादन शब्द करना चाहते हैं जब सभी ने कहा और किया जाता है? – theIV

+0

मैं इसे mememnt पर एक मॉडल में करने के लिए सीमित हूं, इसलिए मैं time_ago_in_words मददगार का लाभ नहीं उठा सकता। मैं सिर्फ एक ग्राहक अनुप्रयोग में int मूल्य वापस ले रहा हूँ। प्रतिक्रिया के लिए सभी को धन्यवाद। – Nick

उत्तर

73

एक बात आप इसे अधिक पठनीय बनाने के लिए क्या कर सकते हैं:

((Time.zone.now - myActiveRecord.visit_date)/1.day).to_i 

संपादित करें:

वास्तव में आप के साथ कोष्ठक के एक सेट से छुटकारा पाने के कर सकते हैं:

(Time.zone.now - myActiveRecord.visit_date).to_i/1.day 
+0

वास्तव में इसके लिए एक विधि है जिसका मैं नीचे उल्लेख करता हूं। – jamesconant

+0

'' (Time.zone.now - 3.days.ago) .to_i/1.day'' आउटपुट '' 2'' – dgilperez

+1

यह हमेशा काम नहीं करता है। मुझे इसके बजाय करना था: '(myActiveRecord.end_date.to_datetime.to_i - Time.now.to_i)/1.day' –

14

मुझे पता है कि यह प्रश्न थोड़ा दिनांकित है, लेकिन मैं इसी तरह के लिए गुगलिंग के दौरान आया था मुसीबत। मेरे मामले में मुझे मैक्रो और सूक्ष्म पैमाने पर पूरे दिनों में अंतर जानने की जरूरत थी।

उदाहरण के लिए, मुझे यह बताने में सक्षम होने के लिए मेरे कोड की आवश्यकता है कि 31 दिसंबर, 2010 को 1 जनवरी, 2012 से 366 दिन पहले और 31 दिसंबर, 2010 23:59 1 जनवरी 2011 से 1 दिन दूर है: 00। ऊपर की विधि पूर्व में काम करती है लेकिन बाद के मामले में, यह कहती है कि वे 0 दिन अलग हैं।

मैं जो कर रहा हूं वह मेरे लिए गणित करने के लिए रुबी के Date वर्ग का उपयोग कर रहा था। मेरी विधि उपरोक्त कोड का उपयोग करते हुए इस तरह दिखता है:

(Time.zone.now.to_date - myActiveRecord.visit_date.to_date).to_i

इस रूपांतरण की वजह से Time या DateTime में जानकारी के साथ काम करेंगे। एक और संभावित समाधान सबसे पहले या DateTimes पर beginning_of_day पर कॉल करना होगा, लेकिन मेरे मामले में, मिनट महत्वपूर्ण थे।

-1

रेल वास्तव में इस तरह की चीज़ के लिए एक विधि बनाई गई है।

चेकआउट #time_ago_in_words

तो, मूल मामले के लिए ...

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i

बनाम

time_ago_in_words(myActiveRecord.visit_date)

+0

असल में यह तरीका मानव पठनीय स्ट्रिंग विवरण देता है, वास्तविक संख्यात्मक अंतर नहीं। –

+0

ओह, अच्छा पकड़ो। – jamesconant

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