1/3
go
IANA के समय क्षेत्र डेटाबेस
का उपयोग करता है सटीक ज़ोन नामों के साथ। रिवर्स इंजीनियर की कोशिश कर रहा है कि कैसे MySQL एक (लिनक्स) होस्ट से स्थानीय टाइमज़ोन प्रारूप को निर्धारित करता है और उस तर्क को go
में डुप्लिकेट करता है क्लाइंट - जैसा कि @MattJohnson ने बताया - अविश्वसनीय साबित होता है।
2/3
database/sql.DB
- Open(drv, DSN)
. के माध्यम से बनाया गया - वही DSN
का उपयोग करेगा सभी कनेक्शनों के लिए। जबकि एक sql.DB
एक बार बनाने और कई बार उपयोग करने के लिए है - DSN
. को बदलने का कोई तरीका नहीं है इस तथ्य के बाद - तो किसी को एक नया sql.DB
बनाने की आवश्यकता होगी DSN
. बदलते समय ।
3/3
तो बेहतर तरीका है, MySQL
का लाभ उठाना प्रतीत होता है सभी datetime
को कन्वर्ट करने के लिए क्लाइंट को ट्रांसमिशन से पहले स्थानीय से यूटीसी टाइमज़ोन में मान। यह DSN
के माध्यम से कनेक्शन समय पर डेटाबेस के (संभवतः अज्ञात) टाइमज़ोन को सेट करने की जटिलता को दूर करता है ।
एक आशाजनक विकल्प, कनेक्शन का सत्र समय क्षेत्र निर्धारित करना है:
SET @@session.time_zone = "+00:00";
- हालांकि, यह केवल वर्तमान . के लिए काम करता है कनेक्शन (कनेक्शन पूल के भीतर)। एक
go
हालांकि क्लाइंट को यह नहीं पता होगा कि वे किसी भी समय किस मुफ्त कनेक्शन का उपयोग कर रहे हैं। - इसलिए यह सुनिश्चित करने के लिए कि यह हमेशा काम करता है, किसी को सभी प्रश्नों से पहले इसे मैन्युअल रूप से लागू करने की आवश्यकता होगी . भले ही केवल एक DB कनेक्शन उपयोग में हो - यदि कनेक्शन विफल हो जाता है और कनेक्शन पुनः प्रयास शुरू हो जाता है - तो कोई भी पिछले सत्र की स्थिति खो जाएगी।
तो इसके बजाय, सभी datatime
. को लपेटकर इस तरह के रूपांतरण फ़ंक्शन वाले कॉलम:
CONVERT_TZ(`STAMP_UPDATED`,@@session.time_zone,'+00:00')
सुनिश्चित करता है कि समय क्षेत्र की गणना क्वेरी समय पर की जाती है और कनेक्शन पुन:कनेक्शन आदि के दौरान खो नहीं जाएगी।
तो अब DSN
अब loc
specify निर्दिष्ट करने की आवश्यकता नहीं है - UTC
. के रूप में डिफ़ॉल्ट है। वास्तव में DSN
केवल ?parseTime=true
. के प्रत्यय विकल्प की आवश्यकता है datetime
. को अनुमति देने के लिए go
. में अनुवाद करने के लिए का मूल time.Time
।
अंत में और सबसे महत्वपूर्ण बात यह है कि यह किसी भी समय क्षेत्र पर सेट किसी भी सर्वर के साथ काम करेगा।
इस पर एच/टी उत्तर ।