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

जेपीए MySQL डेटाबेस में गलत तारीख सहेज रहा है

tl;डॉ

JPA 2.2 का उपयोग करें java.time . के समर्थन के लिए ।

SQL में केवल-दिनांक मानों के साथ कार्य करने के लिए जावा में केवल दिनांक वाली कक्षा का उपयोग करें।

LocalDate                           // Represent a date-only, without a time-of-day and without a time zone.
.now(                               // Get today's date…
    ZoneId.of( "Africa/Tunis" )     // …as seen in the wall-clock time used by the people of a particular region.
)                                   // Returns a `LocalDate` object.
.plusMonths( 1 )                    // Returns another `LocalDate` object, per immutable objects pattern.

java.time

JPA 2.2 अब आधुनिक java.time . का समर्थन करता है कक्षाएं। अब Joda-Time का उपयोग करने की कोई आवश्यकता नहीं है।

करें नहीं java.sql.Date . का उपयोग करें . वह वर्ग नाटक करता है केवल दिनांक का प्रतिनिधित्व करने के लिए लेकिन वास्तव में यूटीसी के लिए एक समय-समय पर सेट है क्योंकि भयानक डिजाइन निर्णय java.util.Date से विरासत में मिला है। (जो नाम के बावजूद और . तारीख का प्रतिनिधित्व करता है दिन का समय और यूटीसी के लिए ही शून्य का ऑफसेट)। ये विरासत वर्ग एक भयानक मनहूस गड़बड़ हैं। सन, ऑरेकल, और जेसीपी समुदाय ने वर्षों पहले जेएसआर 310 को अपनाने के साथ थीसिस कक्षाओं को छोड़ दिया था, और आपको भी ऐसा ही करना चाहिए।

स्थानीय दिनांक

LocalDate वर्ग दिन के समय के बिना और समय क्षेत्र के बिना केवल दिनांक मान का प्रतिनिधित्व करता है या offset-from-UTC

तिथि निर्धारित करने में एक समय क्षेत्र महत्वपूर्ण है। किसी भी क्षण के लिए, तिथि क्षेत्र के अनुसार दुनिया भर में भिन्न होती है। उदाहरण के लिए, मध्यरात्रि के कुछ मिनट बाद पेरिस फ़्रांस में मॉन्ट्रियल क्यूबेक में "कल" ​​रहते हुए एक नया दिन है ।

यदि कोई समय क्षेत्र निर्दिष्ट नहीं है, तो JVM अपने वर्तमान डिफ़ॉल्ट समय क्षेत्र को निहित रूप से लागू करता है। वह डिफ़ॉल्ट किसी भी क्षण बदलें रनटाइम के दौरान (!), इसलिए आपके परिणाम भिन्न हो सकते हैं। अपने वांछित/अपेक्षित समय क्षेत्र को स्पष्ट रूप से तर्क के रूप में निर्दिष्ट करने के लिए बेहतर है। यदि महत्वपूर्ण हो, तो अपने उपयोगकर्ता के साथ क्षेत्र की पुष्टि करें।

एक उचित समय क्षेत्र नाम निर्दिष्ट करें महाद्वीप/क्षेत्र . के प्रारूप में , जैसे अमेरिका/मॉन्ट्रियल , अफ्रीका/कैसाब्लांका , या प्रशांत/ऑकलैंड . कभी भी 2-4 अक्षर के संक्षिप्त नाम का प्रयोग न करें जैसे EST या आईएसटी क्योंकि वे नहीं हैं सही समय क्षेत्र, मानकीकृत नहीं, और अद्वितीय भी नहीं (!)।

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

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

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

या कोई तिथि निर्दिष्ट करें। आप जनवरी-दिसंबर के लिए 1-12 की समझदार संख्या के साथ महीने को एक संख्या से सेट कर सकते हैं।

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

या, बेहतर है, माह<का उपयोग करें /कोड> एनम ऑब्जेक्ट्स पूर्व-परिभाषित, वर्ष के प्रत्येक महीने के लिए एक। युक्ति:इन माह का उपयोग करें आपके कोड को अधिक स्व-दस्तावेज बनाने, मान्य मान सुनिश्चित करने, और प्रकार-सुरक्षा . वर्ष के लिए ठीक वैसा ही &YearMonth

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

तारीख-समय गणित

जाहिरा तौर पर आप एक तारीख से शुरू करना चाहते हैं और एक महीने बाद एक तारीख सीमा के रूप में प्राप्त करना चाहते हैं।

LocalDate monthLater = ld.plusMonths( 1 ) ;

JDBC 4.2

JDBC 4.2 के अनुसार, आपके JDBC ड्राइवर को कुछ कुंजी java.time का समर्थन करना आवश्यक है। LocalDate . जैसी कक्षाएं .

दिनांक-सीमा

तीन-दस-अतिरिक्त . के लिए नीचे दिए गए लिंक पर ध्यान दें . आपको LocalDateRange . मिल सकता है यदि आप दिनांक सीमाओं के साथ बहुत अधिक कार्य करते हैं तो कक्षा आपके लिए उपयोगी होगी।

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

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

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

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

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

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

ThreeTen-Extra परियोजना अतिरिक्त कक्षाओं के साथ java.time का विस्तार करती है। यह परियोजना java.time में संभावित भावी परिवर्धन के लिए एक सिद्ध आधार है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे अंतराल , 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 LIKE क्लॉज में उपयोगकर्ता चर का उपयोग कैसे करें?

  2. mysql डेटा निर्देशिका स्थान

  3. लूप परिणाम पीडीओ पीएचपी

  4. अजगर में MySQL लोड डेटा स्थानीय INFILE उदाहरण?

  5. MySQL `फोर्स इंडेक्स` मामलों का उपयोग करें?