मैनुअल से (अनुभाग 9.6 ):
<ब्लॉकक्वॉट>
वैश्विक और क्लाइंट-विशिष्ट समय क्षेत्रों के वर्तमान मूल्यों को इस तरह पुनर्प्राप्त किया जा सकता है:mysql> SELECT @@global.time_zone, @@session.time_zone;
संपादित करें उपरोक्त रिटर्न SYSTEM
यदि MySQL सिस्टम के टाइमज़ोन का उपयोग करने के लिए सेट है, जो सहायक से कम है। चूंकि आप PHP का उपयोग कर रहे हैं, यदि MySQL से उत्तर SYSTEM
है , फिर आप सिस्टम से पूछ सकते हैं कि यह . कौन सा समय क्षेत्र है date_default_timezone_get
के ज़रिए इस्तेमाल करना
. (बेशक, जैसा कि वोल्करके ने बताया, PHP एक अलग सर्वर पर चल सकता है, लेकिन जैसा कि अनुमान लगाया जाता है, यह मानते हुए कि वेब सर्वर और जिस डीबी सर्वर से बात कर रहे हैं, वे सेट हैं। [यदि वास्तव में में . नहीं है ] वही समय क्षेत्र विशाल नहीं है छलांग।) लेकिन सावधान रहें कि (MySQL के साथ), आप PHP द्वारा उपयोग किए जाने वाले समयक्षेत्र को सेट कर सकते हैं (date_default_timezone_set
), जिसका अर्थ है कि यह OS द्वारा उपयोग किए जाने वाले मान से भिन्न मान की रिपोर्ट कर सकता है। यदि आप PHP कोड के नियंत्रण में हैं, तो आपको पता होना चाहिए कि क्या आप ऐसा कर रहे हैं और ठीक है।
लेकिन MySQL सर्वर किस टाइमज़ोन का उपयोग कर रहा है, इसका पूरा प्रश्न स्पर्शरेखा हो सकता है, क्योंकि सर्वर से पूछना कि यह किस टाइमज़ोन में है, आपको बताता है बिल्कुल कुछ भी नहीं डेटाबेस में डेटा के बारे में। विवरण के लिए पढ़ें:
आगे की चर्चा :
यदि आप सर्वर के नियंत्रण में हैं, तो निश्चित रूप से आप सुनिश्चित कर सकते हैं कि समय क्षेत्र एक ज्ञात मात्रा है। यदि आप सर्वर के नियंत्रण में नहीं हैं, तो आप अपने कनेक्शन द्वारा उपयोग किए जाने वाले समय क्षेत्र को सेट कर सकते हैं इस तरह:
set time_zone = '+00:00';
यह समय क्षेत्र को GMT पर सेट करता है, ताकि आगे कोई भी संचालन (जैसे now()
) GMT का उपयोग करेगा।
ध्यान दें, हालांकि, उस समय और दिनांक मान नहीं हैं MySQL में टाइमज़ोन जानकारी के साथ संग्रहीत:
mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)
mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)
mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select tstamp from foo;
+---------------------+
| tstamp |
+---------------------+
| 2010-05-29 08:31:59 | <== Note, no change!
+---------------------+
1 row in set (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)
mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2010-05-29 08:32:38 | <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)
इसलिए सर्वर के टाइमज़ोन को जानना केवल उन कार्यों के संदर्भ में महत्वपूर्ण है, जिन्हें अभी समय मिलता है, जैसे कि now()
, unix_timestamp()
, आदि।; यह आपको इस बारे में कुछ नहीं बताता कि डेटाबेस डेटा में दिनांक किस समयक्षेत्र का उपयोग कर रहे हैं। आप मान लें . चुन सकते हैं वे सर्वर के टाइमज़ोन का उपयोग करके लिखे गए थे, लेकिन यह धारणा त्रुटिपूर्ण हो सकती है। डेटा में संग्रहीत किसी भी दिनांक या समय का समय क्षेत्र जानने के लिए, आपको यह सुनिश्चित करना होगा कि वे समय क्षेत्र की जानकारी के साथ संग्रहीत हैं या (जैसा कि मैं करता हूं) सुनिश्चित करें कि वे हमेशा GMT में हों।
यह क्यों माना जा रहा है कि सर्वर के टाइमज़ोन त्रुटिपूर्ण का उपयोग करके डेटा लिखा गया था? ठीक है, एक बात के लिए, डेटा एक कनेक्शन का उपयोग करके लिखा गया हो सकता है जो एक अलग समय क्षेत्र निर्धारित करता है। डेटाबेस को एक सर्वर से दूसरे सर्वर पर ले जाया गया हो सकता है, जहां सर्वर अलग-अलग टाइमज़ोन में थे (मैं उसमें भाग गया जब मुझे एक डेटाबेस विरासत में मिला जो टेक्सास से कैलिफ़ोर्निया में स्थानांतरित हो गया था)। लेकिन भले ही डेटा सर्वर पर लिखा गया है, इसके वर्तमान समय क्षेत्र के साथ, यह अभी भी अस्पष्ट है। पिछले साल, संयुक्त राज्य अमेरिका में, डेलाइट सेविंग टाइम 1 नवंबर को दोपहर 2:00 बजे बंद कर दिया गया था। मान लीजिए मेरा सर्वर कैलिफ़ोर्निया में पैसिफ़िक टाइमज़ोन का उपयोग कर रहा है और मेरे पास 2009-11-01 01:30:00
मान है डेटाबेस में। यह कब था? क्या वह 1:30 पूर्वाह्न 1 नवंबर पीडीटी, या 1:30 पूर्वाह्न 1 नवंबर पीएसटी (एक घंटे बाद) था? आपके पास जानने का बिल्कुल कोई तरीका नहीं है। नैतिक:हमेशा दिनांक/समय को GMT में संग्रहीत करें (जो DST नहीं करता है) और जब भी आवश्यक हो वांछित समय क्षेत्र में परिवर्तित करें।