मैनुअल से ( धारा 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
), जिसका अर्थ है कि यह ओएस की तुलना में एक अलग मूल्य की रिपोर्ट कर सकता है। यदि आप PHP कोड के नियंत्रण में हैं, तो आपको पता होना चाहिए कि क्या आप ऐसा कर रहे हैं और ठीक है।
लेकिन MySQL सर्वर किस टाइमज़ोन का उपयोग कर रहा है, इसका पूरा प्रश्न एक स्पर्शरेखा हो सकता है, क्योंकि सर्वर से पूछना कि यह किस समय का है, यह आपको डेटाबेस में डेटा के बारे में बिल्कुल कुछ नहीं बताता है। विवरण के लिए पढ़ें:
आगे की चर्चा :
यदि आप सर्वर के नियंत्रण में हैं, तो निश्चित रूप से आप यह सुनिश्चित कर सकते हैं कि टाइमज़ोन एक ज्ञात मात्रा है। यदि आप सर्वर के नियंत्रण में नहीं हैं, तो आप अपने कनेक्शन द्वारा उपयोग किए जाने वाले टाइमज़ोन को इस तरह सेट कर सकते हैं :
set time_zone = '+00:00';
यह जीएमटी को टाइमजोन सेट करता है, ताकि आगे कोई भी ऑपरेशन (जैसे now()
) जीएमटी का उपयोग करेगा।
ध्यान दें, हालांकि, उस समय और दिनांक मान हैं 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()
, आदि .; यह आपको कुछ भी नहीं बताता है कि डेटाबेस डेटा में डेटज़ोन किस समय का उपयोग कर रहे हैं। आप मान सकते हैं वे सर्वर के टाइमज़ोन का उपयोग करके लिखे गए थे, लेकिन यह धारणा अच्छी तरह से दोषपूर्ण हो सकती है। डेटा में संग्रहीत किसी भी दिनांक या समय के समय क्षेत्र को जानने के लिए, आपको यह सुनिश्चित करना होगा कि वे टाइमज़ोन जानकारी के साथ संग्रहीत हैं या (जैसा कि मैं करता हूं) सुनिश्चित करें कि वे हमेशा जीएमटी में हैं।
यह क्यों माना जा रहा है कि सर्वर के टाइमजोन त्रुटिपूर्ण का उपयोग करके डेटा को लिखा गया था? ठीक है, एक बात के लिए, डेटा को एक कनेक्शन का उपयोग करके लिखा जा सकता है जो एक अलग समय क्षेत्र सेट करता है। डेटाबेस को एक सर्वर से दूसरे में ले जाया गया हो सकता है, जहां सर्वर अलग-अलग टाइमज़ोन में थे (मैं उस समय भाग गया जब मुझे एक डेटाबेस विरासत में मिला जो टेक्सास से कैलिफ़ोर्निया में स्थानांतरित हो गया था)। लेकिन भले ही डेटा सर्वर पर लिखा हो, अपने वर्तमान समय क्षेत्र के साथ, यह अभी भी अस्पष्ट है। पिछले साल, संयुक्त राज्य अमेरिका में, डेलाइट सेविंग टाइम पहली नवंबर को 2:00 बजे बंद कर दिया गया था। मान लीजिए कि मेरा सर्वर पैसिफिक समयक्षेत्र का उपयोग करते हुए कैलिफोर्निया में है और मेरे पास मूल्य है2009-11-01 01:30:00
डेटाबेस में। यह कब था? क्या 1:30 नवंबर 1 पीडीटी, या 1:30 नवंबर 1 पीएसटी (एक घंटे बाद) था? आपके पास जानने का कोई तरीका नहीं है। Moral: हमेशा GMT (जो DST नहीं करता है) में दिनांक / समय स्टोर करें और जब आवश्यक हो, वांछित समय-सीमा में परिवर्तित करें।