Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP, MySQL और समय क्षेत्र

यह उत्तर बाउंटी को समायोजित करने के लिए अद्यतन किया गया है। मूल, असंपादित उत्तर पंक्ति के नीचे है।

बाउंटी मालिक द्वारा जोड़े गए लगभग सभी प्रश्न बिंदु इस संबंध में हैं कि टाइमज़ोन के संदर्भ में MySQL और PHP डेटाटाइम को कैसे इंटरैक्ट करना चाहिए।

MySQL में अभी भी दयनीय है समयक्षेत्र समर्थन , जिसका अर्थ है कि इंटेलिजेंस को PHP-साइड होना चाहिए।

  • अपना MySQL कनेक्शन टाइमज़ोन सेट करें UTC के लिए जैसा कि ऊपर दिए गए लिंक में प्रलेखित है। यह MySQL द्वारा प्रबंधित सभी डेटाटाइम का कारण बनेगा, जिसमें NOW() . भी शामिल है , समझदारी से संभालने के लिए।
  • हमेशा DATETIME का इस्तेमाल करें , कभी भी TIMESTAMP का उपयोग न करें जब तक कि आपको TIMESTAMP . में स्पष्ट रूप से विशेष व्यवहार की आवश्यकता न हो . यह पहले की तुलना में कम दर्दनाक है।
    • यह ठीक है यूनिक्स युग के समय को एक पूर्णांक के रूप में संग्रहीत करने के लिए यदि आपके पास है करने के लिए, जैसे कि विरासत के उद्देश्यों के लिए। युग यूटीसी है।
    • MySQL का पसंदीदा डेटाटाइम प्रारूप PHP दिनांक प्रारूप स्ट्रिंग Y-m-d H:i:s का उपयोग करके बनाया गया है
  • रूपांतरित करें सभी यूटीसी के लिए PHP डेटाटाइम्स जब उन्हें MySQL में संग्रहीत किया जाता है, जो कि एक छोटी सी बात है जैसा कि नीचे बताया गया है
  • MySQL से लौटाए गए डेटाटाइम को PHP डेटटाइम कंस्ट्रक्टर को सुरक्षित रूप से सौंपा जा सकता है। यूटीसी टाइमज़ोन में भी पास होना सुनिश्चित करें!
  • PHP दिनांक समय को उपयोगकर्ता के स्थानीय समय क्षेत्र में बदलें गूंज पर , जल्दी नहीं। शुक्र है कि डेटटाइम की तुलना और अन्य डेटटाइम्स के खिलाफ गणित उस समय क्षेत्र को ध्यान में रखेगा जिसमें प्रत्येक है।
  • आप अभी भी PHP के साथ प्रदान किए गए DST डेटाबेस की सनक पर निर्भर हैं। अपने PHP और OS पैच को अप टू डेट रखें! एक संभावित डीएसटी झुंझलाहट को दूर करने के लिए MySQL को UTC की आनंदमय स्थिति में रखें।

वह अधिकांश . को संबोधित करता है बिंदुओं में से।

आखिरी चीज एक डोजी है:

  • यदि किसी व्यक्ति ने पहले डेटा डाला है तो उसे क्या करना चाहिए (उदाहरण के लिए NOW() का उपयोग करना ) समय क्षेत्र की चिंता किए बिना यह सुनिश्चित करने के लिए कि सब कुछ एक जैसा रहे?

यह एक वास्तविक झुंझलाहट है। अन्य उत्तरों में से एक ने MySQL के CONVERT_TZ , हालांकि मैंने इसे व्यक्तिगत रूप से सर्वर-देशी और यूटीसी टाइमज़ोन के बीच चयन और अपडेट के दौरान किया होगा, क्योंकि मैं उस तरह कट्टर हूं।

<ब्लॉकक्वॉट>

ऐप प्रत्येक उपयोगकर्ता के लिए तदनुसार स्वयं डीएसटी सेट/चुनने में सक्षम होना चाहिए।

आपको इसकी आवश्यकता नहीं है और नहीं करना चाहिए आधुनिक युग में ऐसा करें।

PHP के आधुनिक संस्करणों में DateTimeZone है। वर्ग, जिसमें नामांकित समयक्षेत्रों की सूची की क्षमता शामिल है। . नामित समय क्षेत्र उपयोगकर्ता को अपने वास्तविक स्थान का चयन करने की अनुमति देते हैं, और सिस्टम को स्वचालित रूप से . प्राप्त करते हैं उस स्थान के आधार पर उनके डीएसटी नियम निर्धारित करें।

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

// UTC default
    date_default_timezone_set('UTC');
// Note the lack of time zone specified with this timestamp.
    $nowish = new DateTime('2011-04-23 21:44:00');
    echo $nowish->format('Y-m-d H:i:s'); // 2011-04-23 21:44:00
// Let's pretend we're on the US west coast.  
// This will be PDT right now, UTC-7
    $la = new DateTimeZone('America/Los_Angeles');
// Update the DateTime's timezone...
    $nowish->setTimeZone($la);
// and show the result
    echo $nowish->format('Y-m-d H:i:s'); // 2011-04-23 14:44:00

इस तकनीक का उपयोग करके, सिस्टम स्वचालित रूप से उपयोगकर्ता के लिए सही DST सेटिंग्स का चयन करें, उपयोगकर्ता से यह पूछे बिना कि वे वर्तमान में DST में हैं या नहीं।

आप चयन मेनू को प्रस्तुत करने के लिए एक समान विधि का उपयोग कर सकते हैं। आप एकल दिनांक समय ऑब्जेक्ट के लिए समय क्षेत्र को लगातार पुन:असाइन कर सकते हैं। उदाहरण के लिए, यह कोड इस समय क्षेत्रों और उनके वर्तमान समय को सूचीबद्ध करेगा:

$dt = new DateTime('now', new DateTimeZone('UTC')); 
foreach(DateTimeZone::listIdentifiers() as $tz) {
    $dt->setTimeZone(new DateTimeZone($tz));
    echo $tz, ': ', $dt->format('Y-m-d H:i:s'), "\n";
}

आप कुछ क्लाइंट-साइड मैजिक का उपयोग करके चयन प्रक्रिया को बहुत सरल बना सकते हैं। Javascript में एक स्पॉटी लेकिन फंक्शनल है। दिनांक वर्ग, एक मानक विधि के साथ यूटीसी ऑफ़सेट मिनटों में प्राप्त करें . आप इसका उपयोग संभावित समय क्षेत्रों की सूची को कम करने में मदद के लिए कर सकते हैं, इस अंधी धारणा के तहत कि उपयोगकर्ता की घड़ी सही है।

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

इसके अलावा, यदि आप इसके लिए आधुनिक PHP डेटटाइम और डेटटाइमज़ोन फ्रेमवर्क का उपयोग करना चाहते हैं, तो आपको बहिष्कृत Etc/GMT... का उपयोग करें टाइमज़ोन स्ट्रिंग्स नामित टाइमज़ोन के बजाय। ये ज़ोन नाम भविष्य के PHP संस्करणों से हटाए जा सकते हैं, इसलिए ऐसा करना नासमझी होगी। यह सब मैं अनुभव से कह रहा हूं।

tl;डॉ :आधुनिक टूलसेट का उपयोग करें, तिथि गणित की भयावहता से खुद को बचाएं। उपयोगकर्ता को नामांकित . की सूची के साथ प्रस्तुत करें समय क्षेत्र। अपनी तिथियां UTC में संगृहीत करें , जो किसी भी तरह से डीएसटी से प्रभावित नहीं होगा। डेटाटाइम को उपयोगकर्ता के चयनित नामित समय क्षेत्र प्रदर्शन पर . में कनवर्ट करें , पहले नहीं।

अनुरोध के अनुसार, यहां उपलब्ध समय क्षेत्रों पर एक लूप दिया गया है जो उनके GMT ऑफ़सेट को मिनटों में प्रदर्शित करता है। मैंने एक दुर्भाग्यपूर्ण तथ्य को प्रदर्शित करने के लिए यहां मिनटों का चयन किया:सभी ऑफ़सेट पूरे घंटों में नहीं होते हैं! कुछ वास्तव में पूरे एक घंटे के बजाय डीएसटी के दौरान आधे घंटे आगे स्विच करते हैं। परिणामी ऑफ़सेट मिनटों में चाहिए जावास्क्रिप्ट के Date.getTimezoneOffset . से मिलान करें ।

$utc = new DateTimeZone('UTC');
$dt = new DateTime('now', $utc); 
foreach(DateTimeZone::listIdentifiers() as $tz) {
    $local = new DateTimeZone($tz);
    $dt->setTimeZone($local);
    $offset = $local->getOffset($dt); // Yeah, really.
    echo $tz, ': ', 
         $dt->format('Y-m-d H:i:s'),
         ', offset = ',
         ($offset / 60),
         " minutes\n";
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पायथन में MySQL संग्रहीत प्रक्रिया को कैसे कॉल करें

  2. MySQL ग्रेट सर्कल डिस्टेंस (हावर्सिन फॉर्मूला)

  3. MySQL - एक ही संरचना के साथ कई तालिकाओं से डेटा का चयन करना, लेकिन अलग-अलग डेटा

  4. phpMyAdmin के साथ डेटाबेस कैसे प्रबंधित करें

  5. HTML - बिना रिफ्रेश किए पेज की सामग्री बदलें\अपडेट करें\पेज को फिर से लोड करें