2009-06-01 7 views
5

मैं समय क्षेत्र को सही तरीके से संभालने के लिए हमारे रेल 2.3 एप्लिकेशन को परिवर्तित करने के लिए देख रहा हूं (फिलहाल सब कुछ यूटीसी में है जो सही नहीं है, लेकिन सुविधाजनक है!)।रेल अनुप्रयोग के लिए MySQL डीबी में टाइमज़ोन के साथ दिनांकों को सही ढंग से संग्रहीत करना

मैं environment.rb में ये सेटिंग हैं:

config.active_record.default_timezone = :utc 
config.time_zone = "UTC" 

आगे बढ़ते हुए, हमारे अनुप्रयोग में प्रत्येक अनुरोध मैं समय क्षेत्र स्थापित करने के लिए निम्न सेटिंग बनाने पर योजना पर:

Time.zone = user.time_zone 

कहाँ user.time_zone उनकी चुनी वरीयता है (उदाहरण के लिए US Pacific Time)।

यह ऐप में ठीक काम करता है, लेकिन मेरा प्रश्न संबंधित है कि रेलवे तब MySQL डीबी में स्टोर करता है। यदि उपयोगकर्ता 1 जून 200 9 की तारीख चुनता है, तो यह यूटीसी में डेटाबेस में DATETIME फ़ील्ड में संग्रहीत हो जाता है लेकिन समय क्षेत्र ऑफसेट के साथ संग्रहीत हो जाता है। उदाहरण के लिए, यदि उपयोगकर्ता ने GMT+6 समय क्षेत्र चुना है, तो 1 जून 200 9 की चुनी हुई तिथि डेटाबेस में 2009-06-01 06:00:00 UTC के रूप में समाप्त होती है।

मुझे उम्मीद है कि यह डेटाबेस में 2009-06-01 00:00:00 UTC के रूप में संग्रहीत किया जाएगा। क्या मेरी सोच सही है या रेल कुछ अप्रत्याशित कर रही है?

+0

क्या आपको बस उपयोगकर्ता के समय क्षेत्र में तिथियां प्रदर्शित करने की आवश्यकता है, या विशेष रूप से उस समय क्षेत्र में इसे स्टोर करना महत्वपूर्ण है? –

+0

क्रिस मैं इसे यूटीसी में स्टोर करना चाहता हूं और केवल उपयोगकर्ता के समय क्षेत्र में तिथियां प्रदर्शित करना चाहता हूं – Olly

उत्तर

4

देशी समय क्षेत्र रेल में से निपटने के बारे 2.1+ इस ब्लॉग पोस्ट में बात करती है:

http://mad.ly/2008/04/09/rails-21-time-zone-support-an-overview/

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

0

आपको तारीख सेट करने से पहले डेटा ऑब्जेक्ट में टाइमज़ोन सेट करने की आवश्यकता है।

1

मेरी टिप्पणी के जवाब के आधार पर, मैं बस स्थानीय सर्वर समय के आधार पर तारीख को संग्रहीत करता हूं, फिर जावास्क्रिप्ट की दिनांक :: toLocaleString() का उपयोग अपने स्थानीय टाइमज़ोन में बदलने के लिए करता हूं। मैंने कुछ साल पहले इस पर एक लेख लिखा था, जिसे आप here पा सकते हैं।

लेख का जेएस MooTools में लिखा गया था, लेकिन मैंने इसे jQuery के साथ फिर से लिखा है, इसलिए मैं वह कोड दिखाऊंगा।

महत्वपूर्ण भागों:

जब HTML करने के लिए प्रतिपादन, युग के बाद से मिलीसेकंड का उपयोग करें।

<span class="dt"><!-- <%= blah.created_at_epoch_ms %> --><%= blah.created_at %></span> 

कौन सा अपने मॉडल में एक विधि इस तरह परिभाषित की आवश्यकता है:

def created_at_epoch_ms 
    self.created_at.to_i * 1000 
end 

जे एस दिनांकों को बदलने के लिए:

$(document).ready(function(){ 
     $('span.dt').each(function(){ 
       var date = new Date(); 

       date.setTime(this.firstChild.data); 

       $(this).parent().text(date.toLocaleString()); 
     }); 
}); 

इस उपयोगकर्ता का स्थानीय समय में स्ट्रिंग परिवर्तित करना चाहिए, और जादू LocaleString() में होता है। एकमात्र ब्राउज़र जिसे मैंने सुना है, इसे कार्यान्वित नहीं करता है सफारी 2.0 है, जो किसी समस्या को प्रस्तुत नहीं करना चाहिए, क्योंकि मुझे लगता है कि अधिकांश उपयोगकर्ता आगे बढ़े हैं।

मैं इस विधि का उपयोग my site पर करता हूं, और यदि आप पृष्ठ पर स्रोत कोड देखते हैं, तो आप देख सकते हैं कि यह क्या करता है।वास्तविक कोड है कि ब्राउज़र को भेजी जाने वाली लगता है:

<!-- 1243484521000 -->2009-05-28 04:22:01 UTC 

कौन सा

Wednesday, May 27, 2009 11:22:01 PM 

अगर वे जे एस सक्षम किया है करने के लिए अपने ब्राउज़र (केंद्रीय समय) में परिवर्तित किया जाता है, इसके बारे में मूल्य ले लेंगे टिप्पणी नोड, इसे बदलें, और स्थानीय समय के साथ पूरे स्ट्रिंग (यूटीसी समय सहित) को प्रतिस्थापित करें। यदि जेएस अक्षम है, तो वे केवल उस समय को देखेंगे जब सर्वर इसे देखता है।

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