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

यूटीसी/जीएमटी टाइमज़ोन में एक java.util.Date को एक MySQL टाइमस्टैम्प फ़ील्ड में कैसे स्टोर करें?

संक्षिप्त उत्तर है:

  • my.cnf में "डिफ़ॉल्ट-समय-क्षेत्र=utc" जोड़ें
  • अपने कोड में, यूटीसी में हमेशा "सोचें", अपने उपयोगकर्ताओं के लिए दिनांक प्रदर्शित करने के अलावा
  • JDBC के साथ दिनांक या टाइमस्टैम्प प्राप्त/सेट करते समय, हमेशा कैलेंडर पैरामीटर का उपयोग करें, UTC पर सेट करें:

    resultset.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

  • या तो अपने सर्वर को एनटीपी के साथ सिंक्रोनाइज़ करें, या आपको यह बताने के लिए कि यह कितना समय है, केवल डेटाबेस सर्वर पर भरोसा करें।

लंबा जवाब यह है:

किसी भी डेटाबेस और किसी भी क्लाइंट कोड में दिनांक और समय क्षेत्र के साथ काम करते समय, मैं आमतौर पर निम्नलिखित नीति की अनुशंसा करता हूं:

  1. UTC समयक्षेत्र का उपयोग करने के लिए अपना डेटाबेस कॉन्फ़िगर करें , सर्वर के स्थानीय समय क्षेत्र का उपयोग करने के बजाय (जब तक कि यह निश्चित रूप से यूटीसी न हो)।

    • ऐसा कैसे करें यह आपके डेटाबेस सर्वर पर निर्भर करता है। MySQL के लिए निर्देश यहां देखे जा सकते हैं:http:/ /dev.mysql.com/doc/refman/5.0/hi/time-zone-support.html . मूल रूप से आपको इसे my.cnf में लिखना होगा:default-time-zone=utc

    • इस तरह आप अपने डेटाबेस सर्वर को कहीं भी होस्ट कर सकते हैं, आसानी से अपना होस्टिंग स्थान बदल सकते हैं, और आमतौर पर बिना किसी अस्पष्टता के अपने सर्वर पर तारीखों में हेरफेर कर सकते हैं।

    • यदि आप वास्तव में स्थानीय समय क्षेत्र का उपयोग करना पसंद करते हैं, तो मैं कम से कम डेलाइट सेविंग टाइम को बंद करने की सलाह देता हूं, क्योंकि आपके डेटाबेस में अस्पष्ट तिथियां होना एक वास्तविक दुःस्वप्न हो सकता है।
      • उदाहरण के लिए, यदि आप एक टेलीफोनी सेवा का निर्माण कर रहे हैं और आप अपने डेटाबेस सर्वर पर डेलाइट सेविंग टाइम का उपयोग कर रहे हैं तो आप परेशानी पूछ रहे हैं:यह बताने का कोई तरीका नहीं होगा कि "2008- 10-26 02:30:00" से "2008-10-26 02:35:00" वास्तव में 5 मिनट या 1 घंटे और 5 मिनट के लिए कॉल किया गया था (मान लीजिए कि डेलाइट सेविंग 26 अक्टूबर को सुबह 3 बजे हुई)!
  2. अपने एप्लिकेशन कोड के अंदर, अपने उपयोगकर्ताओं को दिनांक प्रदर्शित करने के अलावा, हमेशा UTC तिथियों का उपयोग करें।

    • जावा में, डेटाबेस से पढ़ते समय, हमेशा उपयोग करें:

    टाइमस्टैम्प myDate =resultSet.getTimestamp("my_date", Calendar.getInstance(TimeZone.getTimeZone("UTC")));

    • यदि आप ऐसा नहीं करते हैं, तो टाइमस्टैम्प को यूटीसी के बजाय आपके स्थानीय टाइमज़ोन में माना जाएगा।
  3. अपने सर्वर को सिंक्रनाइज़ करें या केवल डेटाबेस सर्वर के समय पर भरोसा करें

    • यदि आपके पास एक सर्वर (या अधिक) पर आपका वेब सर्वर और किसी अन्य सर्वर पर आपका डेटाबेस सर्वर है, तो मैं दृढ़ता से अनुशंसा करता हूं कि आप उनकी घड़ियों को एनटीपी के साथ सिंक्रनाइज़ करें।

    • या, आपको यह बताने के लिए कि यह कितना समय है, केवल एक सर्वर पर निर्भर रहें। आमतौर पर, डेटाबेस सर्वर समय मांगने के लिए सबसे अच्छा होता है। दूसरे शब्दों में, इस तरह के कोड से बचें:

    readyStatement =कनेक्शन.prepareStatement("अपडेट my_table SET my_time =? WHERE [...]");
    java.util.Date now =new java.util.Date(); // स्थानीय समय! :-(
    preparedStatement.setTimestamp(1, new Timestamp(now.getTime()));
    int result =readyStatement.execute();

    • इसके बजाय, डेटाबेस सर्वर के समय पर भरोसा करें:

    तैयार स्टेटमेंट =कनेक्शन। प्रीपेयरस्टेटमेंट ("अपडेट माय_टेबल सेट माय_टाइम =नाउ () जहां [...]");
    इंट रिजल्ट =तैयारस्टेटमेंट.एक्सक्यूट ();

उम्मीद है ये मदद करेगा! :-)



  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:विशिष्ट पंक्ति से पहले और बाद में 5 पंक्तियों का चयन करें

  2. इंडेक्स बनाने के बाद MySQL क्वेरी धीमी है

  3. MYSQL काउंट (*) या काउंट (1) में क्या बेहतर है?

  4. पायथन में विकसित करते समय MySQL पासवर्ड की सुरक्षा करना?

  5. MySQL:सेलेक्ट स्टेटमेंट में ऑटो इंक्रीमेंट अस्थायी कॉलम