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

जावा दिनांक और MySQL टाइमस्टैम्प समय-क्षेत्र

tl;डॉ

myPreparedStatement
.setObject(  
    … ,                                   // Specify which placeholder `?` in your SQL statement. 
    OffsetDateTime.now( ZoneOffset.UTC )  // Capture the current moment as seen in the wall-clock time of UTC (an offset-from-UTC of zero).
) ;

लीगेसी डेट-टाइम क्लासेस से बचें

आप भयानक दिनांक-समय कक्षाओं का उपयोग कर रहे हैं जिन्हें java.time द्वारा वर्षों पहले हटा दिया गया था कक्षाएं।

कभी भी Date का उपयोग न करें या Timestamp .

यूटीसी

यूटीसी में वर्तमान क्षण को कैप्चर करें। अधिकांश डेटाबेस यूटीसी में एक पल स्टोर करते हैं। और आम तौर पर आपको अपने अधिकांश व्यावसायिक तर्क, डिबगिंग, लॉगिंग, भंडारण, और डेटा विनिमय UTC में करना चाहिए।

OffsetDateTime

उपयुक्त रूप से नामित OffsetDateTime का उपयोग करके ऑफ़सेट-से-UTC के साथ एक क्षण का प्रतिनिधित्व करें कक्षा।

हम यूटीसी ही चाहते हैं, या शून्य की ऑफसेट। हम उसके लिए एक स्थिरांक का उपयोग कर सकते हैं, ZoneOffset.UTC .

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ) ;

JDBC 4.2

JDBC 4.2 के अनुसार हम सीधे java.time . का आदान-प्रदान कर सकते हैं डेटाबेस के साथ ऑब्जेक्ट।

इस पल को SQL- मानक TIMESTAMP WITH TIME ZONE के समान डेटा प्रकार के कॉलम में सहेजने के लिए :

myPreparedStatement.setObject( … , odt ) ;

पुनर्प्राप्ति:

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

ZonedDateTime

इस पुनर्प्राप्त क्षण को उपयोगकर्ता के सामने प्रस्तुत करने के लिए, आप उपयोगकर्ता के अपेक्षित/वांछित समय क्षेत्र में समायोजित करना चाह सकते हैं।

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

कभी भी डिफ़ॉल्ट समय क्षेत्र पर भरोसा न करें

उपरोक्त कोड में ध्यान दें कि हमने हमेशा वांछित/अपेक्षित ऑफ़सेट या ज़ोन निर्दिष्ट किया है।

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

जावा 6 और 7

वही आदमी, स्टीफन कोलबोर्न, जो JSR 310 और java.time का नेतृत्व करते हैं कार्यान्वयन, साथ ही प्रसिद्ध जोडा-टाइम प्रोजेक्ट, एक अन्य प्रोजेक्ट का भी नेतृत्व करता है, ThreeTen-Backport . अधिकांश java.time लगभग समान API के साथ, इस लाइब्रेरी में कार्यक्षमता को Java 6 और 7 में बैक-पोर्ट किया गया है।

इसलिए अपना सारा काम बैक-पोर्ट क्लासेस में करें। फिर, अंतिम क्षण में, java.sql.Timestamp . से/में कनवर्ट करें DateTimeUtils के ज़रिए कक्षा।

वे रूपांतरण विधियां अधिकतर Instant . का उपयोग करती हैं वस्तुओं। एक Instant यूटीसी में एक पल है, हमेशा यूटीसी में। आप अपने OffsetDateTime . से एडजस्ट कर सकते हैं एक Instant . निकाल कर UTC को . Instant क्लास java.time . में बुनियादी बिल्डिंग-ब्लॉक क्लास है , OffsetDateDate . के साथ एक स्ट्रिंग उत्पन्न करते समय वैकल्पिक स्वरूपण पैटर्न जैसे अधिक लचीलापन होना। लेकिन दोनों Instant और OffsetDateTime समयरेखा पर एक क्षण, एक बिंदु का प्रतिनिधित्व करते हैं।

Instant instant = odt.toInstant() ;  
java.sql.Timestamp ts = org.threeten.bp.DateTimeUtils.toSqlTimestamp( instant ) ;

दूसरी दिशा में जा रहे हैं, एक Timestamp प्राप्त कर रहे हैं अपने डेटाबेस से, फिर तुरंत एक Instant . में कनवर्ट करना .

java.sql.Timestamp ts = myResultSet.getTimestamp( … ) ;
Instant instant = org.threeten.bp.DateTimeUtils.toInstant( ts ) ;

के बारे में java.time

java.time उन्हें> फ्रेमवर्क जावा 8 और बाद में बनाया गया है। ये कक्षाएं पुराने विरासत की जगह लेती हैं दिनांक-समय की कक्षाएं जैसे java.util.Date , Calendar , और SimpleDateFormat

जोडा-टाइम प्रोजेक्ट, अब रखरखाव मोड में , java.time<में माइग्रेशन की सलाह देता है /ए> कक्षाएं।

अधिक जानने के लिए, Oracle Tutorial देखें . और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता है JSR 310

आप java.time . का आदान-प्रदान कर सकते हैं अपने डेटाबेस के साथ सीधे वस्तुओं। JDBC ड्राइवर का उपयोग करें JDBC 4.2 के अनुरूप या बाद में। स्ट्रिंग्स की कोई आवश्यकता नहीं है, java.sql.* . की कोई आवश्यकता नहीं है कक्षाएं।

java.time कक्षाएं कहाँ से प्राप्त करें?

ThreeTen-Extra परियोजना अतिरिक्त कक्षाओं के साथ java.time का विस्तार करती है। यह परियोजना java.time में संभावित भावी परिवर्धन के लिए एक सिद्ध आधार है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval , YearWeek , YearQuarter , और अधिक




  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:जॉइन SUM को दोगुना कर देता है

  2. एक क्वेरी में MySQL में एकाधिक पंक्तियों की गणना करना

  3. वैकल्पिक रंगों का उपयोग करके एक्सेल के क्षेत्र में रंग कोड डुप्लिकेट प्रविष्टियां

  4. java.net.ConnectException

  5. GROUP BY केवल पंक्तियों के साथ एक निश्चित शर्त और तारीख