2011-06-27 12 views
8

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

वर्तमान में मेरे पास config.time_zone = 'Eastern Time (US & Canada)' है जो मेरी एप्लिकेशन फ़ाइल में कॉन्फ़िगर किया गया है क्योंकि यह वह जगह है जहां मैं और अन्य प्रोजेक्ट एडमिनिस्ट्रेटर हैं। कंपनी का मालिक है जो सीए में आधारित है, इसलिए वे प्रशांत समय में होंगे। एप्लिकेशन में वैश्विक दर्शक हैं और हमने अभी तक ऐसा नहीं किया है, फिर भी हम अंततः उपयोगकर्ता पसंदीदा समय क्षेत्र को कार्यान्वित करेंगे।

तो मेरे वर्तमान सवाल:

  1. मैं जानता हूँ कि रेल जादुई करने के लिए और यूटीसी से दिनांक स्तंभ मान बदल देती है जब संग्रहीत और क्रमशः लिया गया है, लेकिन क्या किसी दिए गए दिनांक विशेषता के स्थानीय संस्करण देखने के लिए उचित तरीका है ?

  2. जब एक Time.now बनाम Time.zone.now बनाम Time.now.in_time_zone बनाम DateTime.now बनाम DateTime.now.in_time_zone का प्रयोग करेंगे?

  3. ऊपर सूचीबद्ध विधियों या वर्तमान में कॉन्फ़िगर किए गए समय क्षेत्र से संबंधित किसी अन्य विशिष्ट समय के साथ दिए गए डेटाटाइम विशेषता की तुलना करने का उचित तरीका क्या है? यूटीसी के साथ?

  4. हमारे पास कुछ समय-संवेदनशील चीजें होंगी जिन्हें लेख के समय क्षेत्र के अनुसार एक विशिष्ट समय पर प्रकाशित करने की आवश्यकता है, तो मैं वर्तमान में इसके निर्दिष्ट टाइमज़ोन में उस तुलना को कैसे कर सकता हूं कॉन्फ़िगर किया गया एक (एक उपयोगकर्ता समय क्षेत्र लागू किया जाता है यह सोचते हैं?)

  5. (नया प्रश्न) अगर मैं एक बाद की तारीख में UTC करने के लिए config.time_zone बदल क्या होता है? क्या मुझे डेटाबेस में अपने सभी समय रीसेट करना है या क्या यह अन्यथा पुराने समय को प्रभावित करता है?

+0

का डिफ़ॉल्ट मान नियंत्रित करता है यह एक अच्छा सवाल है; मुझे समय क्षेत्र को सही तरीके से कार्यान्वित करने के बारे में अभी भी अच्छे दस्तावेज़ नहीं मिल पाए हैं। मैं सूची में दो प्रश्न जोड़ूंगा: '6। क्या डेलाइट सेविंग्स टाइम के लिए रेल संवेदनशील हैं और/या आप समय क्षेत्र समर्थन को कैसे संवेदनशील करते हैं जो संवेदनशील है? 'और '7। रेलवे दिनांक दिनांक कॉलम बनाम डेटटाइम कॉलम के लिए समय क्षेत्र और डीएसटी कैसे संभालता है? 'और शायद '8। क्या यह डेटाबेस अज्ञेयवादी है या इसे SQLite बनाम MySQL बनाम दूसरों के लिए अलग-अलग संभालने की आवश्यकता है? ' – Clay

+0

@Clay: क्या आप इन प्रश्नों पर और जानकारी प्राप्त कर पाएंगे? मैं अभी भी इस विषय पर अधिक जानकारी की तलाश में हूं। –

+0

मुझे बहुत अच्छी जानकारी नहीं मिली है। समय क्षेत्र के साथ काम करना शौक शौक का सबसे निराशाजनक और समय लेने वाला हिस्सा है जिसे मैं काम कर रहा हूं। इस सवाल का एक अच्छा जवाब था कि मैंने पूछा: http://stackoverflow.com/questions/8466903/rails-3-1-querying-postgres-for-records-within-a-time-range लेकिन यह केवल प्रासंगिक है postgres। – Clay

उत्तर

8

सबसे पहले, यह समझना महत्वपूर्ण है कि रेल की टाइमज़ोन सामग्री काफी हद तक प्रस्तुति के बारे में है। दृश्यों के पीछे, सब कुछ यूटीसी में होता है।

क्यू 1। कंसोल रेल में आपके द्वारा डिफ़ॉल्ट टाइमज़ोन में समय प्रदर्शित होगा, इसलिए Something.last.created_at टाइम.ज़ोन

Q2 द्वारा दिए गए क्षेत्र में टाइमस्टैम्प प्रदर्शित करता है। ये सभी एक वस्तु को वापस करते हैं जो 'अब' का प्रतिनिधित्व करता है। डेटटाइम बनाम समय की पसंद टाइमज़ोन से संबंधित नहीं है। यदि आपको यूनिक्स युग के बाहर के समय का प्रतिनिधित्व करने में सक्षम होने की आवश्यकता है उदाहरण के लिए, डेटटाइम का उपयोग करें। Time.now और Time.zone.now के बीच का अंतर यह है कि क्या आप समय का एक उदाहरण वापस प्राप्त करते हैं (जो सर्वर के स्थानीय टाइमज़ोन में नियंत्रक के रूप में होगा)। इस उदाहरण के लिए नियंत्रित होता है कि to_s रिटर्न नहीं बल्कि समय में क्या तत्काल प्रतिनिधित्व किया है:

SomeModel.create(:time_attribute => Time.now) 
SomeModel.create(:time_attribute => Time.zone.now) 

डेटाबेस में एक ही पंक्ति सम्मिलित होंगे। यदि आप केवल उपयोगकर्ता को समय प्रदर्शित कर रहे हैं (उदाहरण के लिए यदि आप साइट शीर्षलेख में वर्तमान समय प्रदर्शित करते हैं) तो आपको Time.zone.now का उपयोग करना चाहिए ताकि यह सही टाइमज़ोन में प्रदर्शित हो। यदि आप इसे डीबी में संग्रहीत कर रहे हैं तो यह वास्तव में कोई फर्क नहीं पड़ता - Activerecord इसे किसी भी समय WitZone में परिवर्तित करता है।

क्यू 3।TimeWithZone पर तुलना विधियों को तिथि के यूटीसी संस्करण की तुलना करके कार्यान्वित किया जाता है, ताकि आप अलग-अलग क्षेत्रों में सुरक्षित समय की तुलना कर सकें - आपको उन्हें कुछ सामान्य समय क्षेत्र में बदलने की आवश्यकता नहीं है। आप सादे समय ऑब्जेक्ट्स के साथ टाइमविथज़ोन उदाहरणों की तुलना भी कर सकते हैं।

क्यू 4। आपको आमतौर पर कुछ भी करने की आवश्यकता नहीं होती है। इसे लागू करने का एक आम तरीका आपके मॉडल पर published_at विशेषता होगी। सूची लेख प्रदर्शित करने वाले पेज

where('published_at <= ?', Time.now) 

क्वेरी में शर्त जोड़ देंगे। जब आप अपना आलेख बनाते हैं, तो रेल फॉर्म से दिनांक का समय लेता है और इसे यूटीसी में परिवर्तित करता है, इसलिए डेटाबेस में संग्रहीत क्या है published_at समय का यूटीसी संस्करण है। तुलना समय क्षेत्र स्वतंत्र है, इसलिए क्वेरी केवल समय क्षेत्र के मामले में कोई फर्क नहीं पड़ता।

यह दिन की सामग्री (जैसे '4 बजे') के शुद्ध समय के साथ जटिल हो सकता है क्योंकि समय क्षेत्र रूपांतरण केवल तभी किया जा सकता है जब आप तिथि भी जानते हैं (यानी आप समय में सटीक तत्काल जानते हैं), जैसा कि डीटीएस (या राजनीतिक घटनाएं जैसे देशों ने अपना टाइमज़ोन बदल दिया) यूटीसी में ऑफसेट बदल गया। इस तरह की स्थिति में आप आमतौर पर दिन के समय को स्टोर करना चाहते हैं और जितनी देर हो सके इसे पूर्णकालिक में परिवर्तित कर सकते हैं, जब आप तिथि भी जानते हैं।

Q5। रेल हमेशा डेटाबेस में यूटीसी स्टोर करता है। इसका प्रत्यक्ष परिणाम यह है कि config.time_zone बदलना आपको डेटाबेस में संग्रहीत डेटा को बदलने की आवश्यकता नहीं है। आप प्रति उपयोगकर्ता आधार पर Time.zone भी सेट कर सकते हैं ताकि उपयोगकर्ता अपने टाइमज़ोन में समय देख सकें - config.time_zone बस टाइम.ज़ोन

+0

शानदार रूप से व्यापक स्पष्टीकरण। धन्यवाद। –

+0

मैं हमेशा इसके बारे में उलझन में रहा हूं, आपका जवाब शानदार है। –

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