मैं इसे अपने उद्देश्यों के लिए समझ गया हूँ। मैं संक्षेप में बताऊंगा कि मैंने क्या सीखा (क्षमा करें, ये नोट क्रियात्मक हैं; वे मेरे भविष्य के रेफरल के लिए उतने ही हैं जितना कुछ और)।
मैंने अपनी पिछली टिप्पणियों में जो कहा, उसके विपरीत, DATETIME और TIMESTAMP क्षेत्र अलग-अलग व्यवहार करते हैं। TIMESTAMP फ़ील्ड (डॉक्स संकेत के अनुसार) जो भी आप उन्हें "YYYY-MM-DD hh: mm: ss" फॉर्मेट में भेजते हैं और उसे अपने वर्तमान समय-क्षेत्र से बदलकर UTC समय में बदल देते हैं। जब भी आप डेटा पुनर्प्राप्त करते हैं, तो रिवर्स पारदर्शी रूप से होता है। DATETIME फ़ील्ड इस रूपांतरण को नहीं बनाते हैं। वे जो कुछ भी आप उन्हें भेजते हैं और बस सीधे स्टोर करते हैं
न तो DATETIME और न ही TIMESTAMP फ़ील्ड प्रकार DST का अवलोकन करने वाले समयक्षेत्र में डेटा को सही ढंग से संग्रहीत कर सकते हैं । यदि आप "2009-11-01 01:30:00" स्टोर करते हैं, तो खेतों में यह अंतर करने का कोई तरीका नहीं है कि आप 1:30 के किस संस्करण को चाहते हैं - -04: 00 या -05: 00 संस्करण।
ठीक है, इसलिए हमें अपना डेटा एक गैर डीएसटी समयक्षेत्र (जैसे यूटीसी) में संग्रहित करना चाहिए। TIMESTAMP फ़ील्ड इस डेटा को उन कारणों के लिए सटीक रूप से प्रबंधित करने में असमर्थ हैं, जो मैं समझाता हूँ: यदि आपका सिस्टम DST टाइमज़ोन पर सेट है, तो आप TIMESTAMP में जो डालते हैं वह वह नहीं हो सकता है जो आप वापस प्राप्त करते हैं। यहां तक कि अगर आप यह डेटा भेजते हैं, जिसे आपने पहले ही यूटीसी में बदल दिया है, तब भी यह आपके स्थानीय टाइमज़ोन में डेटा को ग्रहण करेगा और यूटीसी के लिए एक और रूपांतरण करेगा। यह TIMESTAMP- लागू स्थानीय-से-UTC-बैक-टू-लोकल राउंडट्रिप हानिपूर्ण है, जब आपका स्थानीय समयक्षेत्र DST ("2009-11-01 01:30:00" मैप्स से 2 अलग-अलग संभावित समय तक) का अवलोकन करता है।
DATETIME के साथ आप अपने डेटा को किसी भी समयक्षेत्र में संग्रहीत कर सकते हैं जिसे आप चाहते हैं और आश्वस्त रहें कि आप जो भी भेजेंगे उसे वापस प्राप्त करेंगे (आप हानिपूर्ण राउंडट्रिप रूपांतरणों में मजबूर नहीं होंगे जो कि TIMESTAMP फ़ील्ड आपके ऊपर फ़िस्ट करते हैं)। तो इसका समाधान यह है कि DATETIME फ़ील्ड का उपयोग करें और अपने सिस्टम टाइम ज़ोन में से जो भी गैर-DST ज़ोन आप इसे सहेजना चाहते हैं , उसे फ़ील्ड में कनवर्ट करने से पहले फ़ील्ड में सहेजें (मुझे लगता है कि UTC शायद सबसे अच्छा विकल्प है)। यह आपको अपनी स्क्रिप्टिंग भाषा में रूपांतरण तर्क बनाने की अनुमति देता है ताकि आप "2009-11-01 01:30:00 -04: 00" या "2009-11-01 01:30" के यूटीसी समकक्ष को स्पष्ट रूप से बचा सकें। 00 -05: 00 "।
ध्यान देने वाली एक और महत्वपूर्ण बात यह है कि यदि आप DST TZ में अपनी तिथियों को संग्रहीत करते हैं तो MySQL की तिथि / समय गणित फ़ंक्शन DST सीमाओं के आसपास ठीक से काम नहीं करते हैं। यूटीसी में बचाने के लिए सभी और अधिक कारण।
संक्षेप में मैं अब यह करता हूं:
डेटाबेस से डेटा प्राप्त करते समय:
एक सटीक यूनिक्स टाइमस्टैम्प प्राप्त करने के लिए MySQL के बाहर UTC के रूप में डेटाबेस से स्पष्ट रूप से डेटा की व्याख्या करें। मैं इसके लिए PHP के strtotime () फ़ंक्शन या उसके DateTime वर्ग का उपयोग करता हूं। इसे MySQL के अंदर MySQL के CONVERT_TZ () या UNIX_TIMESTAMP () फ़ंक्शन का उपयोग करके मज़बूती से नहीं किया जा सकता है क्योंकि CONVERT_TZ केवल 'YYYY-MM-DD hh: mm' ss '' वैल्यू का उत्पादन करेगा जो अस्पष्टता समस्याओं से ग्रस्त है, और UNIX_TIMESTAMP () इसकी मान लेता है इनपुट सिस्टम टाइमज़ोन में है, टाइमज़ोन नहीं डेटा को (UTC) में संग्रहीत किया गया था।
डेटाबेस में डेटा संग्रहीत करते समय:
अपनी तिथि को उस सटीक UTC समय में परिवर्तित करें, जो आप MySQL के बाहर चाहते हैं। उदाहरण के लिए: PHP के डेटाइम क्लास के साथ आप "2009-11-01 1:30:00 ईएसटी" को "2009-11-01 1:30:00 EDT" से विशिष्ट रूप से निर्दिष्ट कर सकते हैं, फिर इसे यूटीसी में बदल सकते हैं और सही यूटीसी समय बचा सकते हैं आपके DATETIME फ़ील्ड में।
ओह। सभी के इनपुट और मदद के लिए बहुत बहुत धन्यवाद। उम्मीद है कि यह किसी और को सड़क के नीचे कुछ सिरदर्द बचाता है।
BTW, मैं इसे MySQL 5.0.22 और 5.0.27 पर देख रहा हूं