2011-12-18 13 views
20

में दो टाइमस्टैम्प एक ही दिन हैं, मैं रूबी में डेट, डेटटाइम और टाइम के बीच थोड़ा उलझन में हूं। और भी, मेरा आवेदन टाइमज़ोन के प्रति संवेदनशील है, और मुझे यकीन नहीं है कि टाइमज़ोन-मजबूत होने के दौरान इन तीनों के बीच कैसे परिवर्तित किया जाए।जांचें कि रूबी

मैं कैसे जांच सकता हूं कि दो यूनिक्स टाइमस्टैम्प (युग के बाद से सेकंड) उसी दिन का प्रतिनिधित्व करते हैं? (मुझे वास्तव में बुरा नहीं लगता है कि यह स्थानीय समय या यूटीसी का उपयोग करता है, जबकि मैं स्थानीय समय पसंद करता हूं, जब तक कि यह सुसंगत हो, मैं इसके आसपास डिजाइन कर सकता हूं)।

उत्तर

37

मानक का उपयोग करना: Time वर्ग के विस्तार के बिना

Time.at(ts1).to_date === Time.at(ts2).to_date 

और यहाँ कम विवादास्पद तरीका है:

class Time 
    def to_date 
    ::Date.new(year, month, day) 
    end 
end 

इसका इस्तेमाल करते हुए आप ऐसा timestamps तुलना कर सकते हैं: यह है कि यह कैसे लग रहा है की तरह है पुस्तकालय, एक समय वस्तु को एक तिथि में परिवर्तित करें।

require 'date' 

Time.at(x).to_date === Time.at(y).to_date 

दिनांक === विधि यह सच हो सकता है अगर दो तारीख वस्तुओं एक ही दिन का प्रतिनिधित्व किया है।

+0

क्या यह यूटीसी में है, तो? – chimeracoder

+0

रूबी में तिथियां और टाइम्स समय क्षेत्र जागरूक हैं। तो यदि आप यूटीसी का उपयोग कर डेट ऑब्जेक्ट बनाते हैं, तो हाँ यह यूटीसी में होगा। यदि आप उन्हें एक अलग क्षेत्र का उपयोग करके बनाते हैं, तो वे उस क्षेत्र में होंगे। – Anurag

+2

एह, यह क्यों गिराया गया था? – Anurag

5

ActiveSupport Time कक्षा के लिए अच्छा to_date method परिभाषित करता है।

t1 = Time.at(ts1) # local time corresponding to given unix timestamp ts1 
t2 = Time.at(ts2) 
Date.new(t1.year, t1.month, t1.day) === Date.new(t2.year, t2.month, t2.day) 
+0

यह प्रश्न 'रूबी' के साथ टैग किया गया है; मुझे नहीं लगता कि यह मानना ​​उचित है कि वह रेल का उपयोग कर रहा है। –

+0

हाँ, मैं रेल का उपयोग नहीं कर रहा हूं। इसके अलावा, Time.at (1324196871) .to_date == Time.at (1324253810) .to_date मेरे लिए झूठा रिटर्न देता है ... क्या यह स्वचालित रूप से टाइमस्टैम्प को मेरे लिए लोकलटाइम में परिवर्तित कर रहा है? – chimeracoder

+0

लेकिन वह स्वयं इस सहायक विधि को परिभाषित कर सकता है। कोड प्रदान किया जाता है। :-) –

2
Time.at(ts1).day == Time.at(ts2).day && (ts1 - ts2).abs <= 86400 

या

t1 = Time.at(ts1) 
t2 = Time.at(ts2) 
t1.yday == t2.yday && t1.year == t2.year 

पहले मामले में हम यह सुनिश्चित करें कि timestamps कोई अलग दिन से अधिक कर रहे हैं (क्योंकि #day महीने के लिए और इस अतिरिक्त जांच के बिना दिन रिटर्न अप्रैल 1 मई से बराबर होगा 1)

एक विकल्प साल का दिन लेना और सुनिश्चित करना है कि वे एक ही वर्ष के हैं।

इन विधियों दोनों 1.8 और 1.9 :-) में समान रूप से अच्छी तरह से काम

1

हम समय की beginning_of_day का उपयोग और उनकी तुलना कर सकते हैं: t1.beginning_of_day == t2.beginning_of_day इस तरह समय क्षेत्र प्रभावित नहीं होगा।

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