मेरे पास एक रेल समय-आधारित क्वेरी है जिसमें कुछ अजीब टाइमज़ोन संवेदनशील व्यवहार है, भले ही मुझे पता है कि मैं यूटीसी का उपयोग कर रहा हूं। संक्षेप में, इन प्रश्नों अलग जवाब दे:टाइमज़ोन के आधार पर यह रेल क्वेरी अलग-अलग व्यवहार क्यों करती है?
>> Model.find(:all,:conditions=>['created_at<=?',(Time.now-1.hours).gmtime]).length
=> 279
>> Model.find(:all,:conditions=>['created_at<=?',(Time.now-1.hours)]).length
=> 280
कहाँ डीबी वास्तव में एक मॉडल अंतिम घंटे में बनाया शामिल करता है, और मॉडल की कुल संख्या 280 तो केवल पहली क्वेरी सही है।
हालांकि, environment.rb में मेरे पास है:
config.time_zone = 'UTC'
प्रणाली समय क्षेत्र (के रूप में 'तारीख' द्वारा रिपोर्ट) BST (जो जीएमटी + 1 है) - तो किसी भी तरह इस ऊपर से हवाएँ रूप में व्यवहार किया जा रहा है यूटीसी और तोड़ने के सवाल।
यह मुझे सभी प्रकार की समस्याओं का कारण बन रहा है क्योंकि मुझे किसी कार्रवाई में अलग-अलग समय में गुजरने वाली क्वेरी को पैरामीटर करने की आवश्यकता होती है (जिसे बाद में टाइम.परसे() का उपयोग करके परिवर्तित किया जाता है, और भले ही मैं यूटीसी टाइम्स में भेजूं, एक घंटे से दूर 'डीएसटी मुद्दे फसल बहुत कुछ। यहां तक कि '.gmtime()' का उपयोग करने से हमेशा इसे ठीक नहीं लगता है।
जाहिर है कि अंतर किसी भी तरह से एक अंतर्निहित रूपांतरण से होता है जिसके परिणामस्वरूप बीएसटी को गलत तरीके से यूटीसी के रूप में माना जाता है, लेकिन क्यों? रेलवे यूटीसी में टाइमस्टैम्प स्टोर नहीं करता है? टाइम क्लास टाइमज़ोन जागरूक नहीं है? मैं रेल का उपयोग कर रहा हूं 2.2.2
तो यहां क्या हो रहा है - और इसके आसपास कार्यक्रम करने का सुरक्षित तरीका क्या है?
संपादित करें, कुछ अतिरिक्त जानकारी दिखाने के लिए क्या DB और समय वर्ग कर रहे हैं:
>> Model.find(:last).created_at
=> Tue, 11 Aug 2009 20:31:07 UTC +00:00
>> Time.now
=> Tue Aug 11 22:00:18 +0100 2009
>> Time.now.gmtime
=> Tue Aug 11 21:00:22 UTC 2009
दिलचस्प ... Time.utc Time.gmtime के लिए एक पर्याय है? इसके अलावा मुझे >> Time.zone => #> प्राप्त करें। मुझे लगता है कि समस्या यह है कि "11 अगस्त 22:00:18 +0100 200 9" और "ट्यू 11 अगस्त 21:00:22 यूटीसी 200 9" के बारे में सोचने के मेरे तरीके के लिए एक ही तार्किक समय का संदर्भ लें। मुझे लगता है कि एसक्यूएल बनाने के दौरान रेल/रूबी ऑफसेट को अनदेखा कर रहा है। –
frankodwyer
मेरा मानना है कि समय # यूटीसी समय # जीएमटाइम के लिए सिर्फ एक उपनाम है।साथ ही, टाइमज़ोन ऑफसेट को सामान्य समय (टाइम.now) से निपटने पर नजरअंदाज कर दिया जाता है लेकिन Time.zone.now का उपयोग करते समय ध्यान में रखा जाता है। हमेशा Time.zone का उपयोग करने के लिए सबसे अच्छा है तो आपको उस पर "utc" कॉल नहीं करना चाहिए। – ryanb
धन्यवाद, जो बहुत मदद करता है। यह मेरे लिए अनजान है कि यह इस तरह से काम करता है लेकिन कम से कम मैं समझता हूं कि अब क्या हो रहा है। मैंने तदनुसार कोड बदल दिया है और ऐसा लगता है कि इस मुद्दे को मंजूरी दे दी गई है। एक और चीज जो मेरे कोड को फेंक रही थी वह थी कि 1. वर्ष 1 साल तक समान रूप से विभाजित नहीं है जैसा कि मैंने उम्मीद की थी ... मैं एक लूप कर रहा था और इसके कारण एक असंबंधित लेकिन इसी तरह की त्रुटि प्राप्त कर रहा था। – frankodwyer