2010-10-27 17 views
13

मैं रेल में टाइमज़ोन के बारे में थोड़ा उलझन में हूं। मैं चाहता हूं कि मेरे रेल ऐप ने ब्रिटिश मॉड्यूल टाइम (यूएस में डेलाइट सेविंग की तरह) का इस्तेमाल किया है, जो कि मेरे मॉडल में अपडेट_ट और बनाई गई_टैट में सेट टाइमस्टैम्प के लिए है। मैं अपने environment.rb बदलरेल टाइमस्टैम्प सही समय क्षेत्र का उपयोग नहीं करते

config.time_zone = 'London' 

ubuntu सर्वर पर समय आ गया है के लिए BST उपयोग करने के लिए लगता है मेरे ऐप है कहने के लिए: अगर मैं टाइप 'तारीख' मैं (वर्तमान समय मिलता है, उदाहरण के लिए कमांड लाइन में, एक घंटे तक ऑफसेट नहीं)। रेल कंसोल में, मैं निम्नलिखित देखता हूं:

>> time = Time.now 
=> Wed Oct 27 16:29:17 +0100 2010 
>> time.zone 
=> "BST" 

सभी ठीक है। हालांकि, अगर मैं एक नया एआर मॉडल ऑब्जेक्ट बनाता हूं और इसे सेव करता हूं, तो टाइमस्टैम्प एक घंटे पहले से हैं। तो, ऐसा लगता है कि यह यूटीसी का उपयोग कर रहा है। अब, मैं इसमें तर्क देख सकता हूं: चूंकि टाइमस्टैम्प मॉडल तर्क में उपयोग किया जा सकता है, इसलिए आप उन्हें एक अनजान यार्डस्टिक समय, यानी यूटीसी पर आधारित होना चाहते हैं।

#change a record and save it 
>> someobj.save 
=> true 
#object's updated_at is one hour ago 
>> someobj.updated_at 
=> Wed, 27 Oct 2010 15:34:22 UTC +00:00 
>> Time.now 
=> Wed Oct 27 16:34:31 +0100 2010 
#however, Time.now - object's updated at is just a few seconds. 
>> Time.now - someobj.updated_at 
=> 15.305549 

तो, घटाव करने से पहले, updated_at वर्तमान समय क्षेत्र में बदल दिया है: लेकिन, इस व्यवहार का एक अजीब सा है कि मुझे समझ नहीं आता है।

कारण मैं वर्तमान समय क्षेत्र में दिनांक दिखाना चाहता हूं, केवल विचारों की स्थिति रिपोर्ट आदि के लिए है: यदि कोई ऐसा कुछ अपडेट करता है तो मैं उन्हें यह देखना चाहता हूं कि इसे '1 मिनट पहले' अपडेट किया गया था 'एक घंटा पहले नहीं' '।

क्या कोई मुझे अनवरोधित कर सकता है? चीयर्स, अधिकतम

संपादित करें: स्थिति में सही समय दिखाने का मेरा तत्काल समस्या, 'time_ago_in_words' सहायक का उपयोग करके हल की जाती है, जो समय क्षेत्र के लिए समायोजित होती है। मैं अभी भी किसी को यह समझाने के लिए पसंद करूंगा कि टाइमस्टैम्प के साथ क्या चल रहा है :)

उत्तर

38

टाइमस्टैम्प डिफ़ॉल्ट रूप से यूटीसी में संग्रहीत होते हैं, और यह संभवतः ऐसा करने का सबसे अच्छा तरीका है। यदि आप एक सर्वर वातावरण से दूसरे में स्थानांतरित करते हैं, तो आप नहीं चाहते हैं कि आप अपने सभी समय बस स्थानांतरित कर दें क्योंकि आपने समय क्षेत्र स्विच किया है।

आप को पता है कि टाइमस्टैम्प आपके स्थानीय समय क्षेत्र में है चाहते हैं, तो आप सिर्फ इसके लिए उस तरह से पूछने के लिए:

someobj.updated_at.localtime 
+0

आह - तो बढ़िया है। धन्यवाद! मैं मानता हूं कि यूटीसी में उन्हें सभी को समझना समझ में आता है। –

+0

ठीक है, मुझे मिल गया। लेकिन अगर मैं डेटाटाइम पर लोकलटाइम प्रदर्शित करना चाहता हूं तो मेरे विचार पर चयन करें कि मैं क्या कर सकता हूं? – Diego

+0

शायद स्थानीय समय ब्राउज़र समय पर सिस्टम समय मैप करने के लिए जावास्क्रिप्ट विधि का उपयोग करने का सबसे अच्छा तरीका है। हालांकि यह एक और सवाल है। – tadman

2

समय के अंत में सूचीबद्ध ऑफ़सेट नोट करें - पहला ऑफसेट 0 है, दूसरा 1 है। जब समय गणना होती है, ऑफ़सेट स्वचालित रूप से शामिल किया गया है, ताकि घटाव आपको सही परिणाम देता है। someobj.updated_at और Time.now प्रत्येक एक अलग समय क्षेत्र में अपना मान प्रदर्शित करता है, इसलिए वे वास्तव में केवल 9 सेकंड अलग हैं, 1 घंटे और 9 सेकंड नहीं।

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