यह नियुक्ति के प्रकार पर निर्भर करता है।
अपॉइंटमेंट दो प्रकार के होते हैं:
- समय क्षेत्र के नियमों में किसी भी बदलाव को अनदेखा करते हुए, एक क्षण, समयरेखा पर एक विशिष्ट बिंदु।
उदाहरण:रॉकेट प्रक्षेपण। - दिन का एक दिनांक और समय जो समय क्षेत्र के नियमों में परिवर्तन के लिए समायोजित होना चाहिए।
उदाहरण:चिकित्सा/दंत यात्रा।
पल
उदाहरण के लिए, यदि हम किसी रॉकेट के प्रक्षेपण की बुकिंग कर रहे हैं, तो हमें दिन की तारीख और समय की परवाह नहीं है। हम केवल उस पल की परवाह करते हैं जब (ए) आकाश संरेखित होता है, और (बी) हम अनुकूल मौसम की उम्मीद करते हैं।
यदि बीच के समय में राजनेता हमारे लॉन्च साइट या हमारे कार्यालयों में उपयोग में आने वाले समय क्षेत्र के नियमों को बदलते हैं, तो इसका हमारे लॉन्च अपॉइंटमेंट पर कोई प्रभाव नहीं पड़ता है। अगर हमारी लॉन्च साइट को नियंत्रित करने वाले राजनेता डेलाइट सेविंग टाइम (DST) को अपनाते हैं। , हमारे लॉन्च का क्षण वही रहता है। यदि हमारे कार्यालयों को संचालित करने वाले राजनेता राजनयिक संबंधों के कारण घड़ी को आधा घंटा पहले बदलें एक पड़ोसी देश के साथ, हमारे लॉन्च का क्षण वही रहता है।
ऐसी नियुक्ति के लिए, हाँ, आपका दृष्टिकोण सही होगा। आप अपॉइंटमेंट को UTC
में रिकॉर्ड करेंगे। TIMESTAMP WITH TIME ZONE
. प्रकार के कॉलम का उपयोग करना . पुनर्प्राप्ति पर, उपयोगकर्ता द्वारा पसंद किए जाने वाले किसी भी समय क्षेत्र में समायोजित करें।
डेटाबेस जैसे Postgres
यूटीसी में समायोजित करने के लिए इनपुट के साथ किसी भी समय क्षेत्र की जानकारी का उपयोग करें, और फिर उस समय क्षेत्र की जानकारी का निपटान करें। जब आप Postgres से मान पुनर्प्राप्त करते हैं, तो यह हमेशा UTC में देखे गए समय-समय के साथ एक तिथि का प्रतिनिधित्व करेगा। सावधान रहें, कुछ टूलिंग या मिडलवेयर में डेटाबेस से पुनर्प्राप्ति और आपको प्रोग्रामर को डिलीवरी के बीच कुछ डिफ़ॉल्ट समय क्षेत्र लागू करने की एंटी-फीचर हो सकती है। लेकिन स्पष्ट रहें:Postgres हमेशा TIMESTAMP WITH TIME ZONE
प्रकार के मानों को सहेजता और पुनर्प्राप्त करता है UTC में, हमेशा UTC, और offset-from-UTC
शून्य घंटे-मिनट-सेकंड।
यहाँ जावा कोड का कुछ उदाहरण दिया गया है।
LocalDate launchDateAsSeenInRome = LocalDate.of( 2021 , 1 , 23 ) ;
LocalTime launchTimeAsSeenInRome = LocalTime.of( 21 , 0 ) ;
ZoneId zoneEuropeRome = ZoneId.of( "Europe/Rome" ) ;
// Assemble those three parts to determine a moment.
ZonedDateTime launchMomentAsSeenInRome = ZonedDateTime.of( launchDateAsSeenInRome , launchTimeAsSeenInRome , zoneEuropeRome ) ;
UTC में उसी क्षण को देखने के लिए, Instant
. में कनवर्ट करें . एक Instant
वस्तु हमेशा यूटीसी में देखे गए क्षण का प्रतिनिधित्व करती है।
Instant launchInstant = launchMomentAsSeenInRome.toInstant() ; // Adjust from Rome time zone to UTC.
Z
उपरोक्त स्ट्रिंग उदाहरण के अंत में यूटीसी के लिए मानक संकेतन है, और इसका उच्चारण "ज़ुलु" है।
दुर्भाग्य से JDBC 4.2 टीम ने Instant
या ZonedDateTime
प्रकार। तो आपका JDBC ड्राइवर
आपके डेटाबेस में ऐसी वस्तुओं को पढ़ने/लिखने में सक्षम हो भी सकता है और नहीं भी। अगर नहीं, तो बस OffsetDateTime
. तीनों प्रकार एक क्षण का प्रतिनिधित्व करते हैं, समयरेखा पर एक विशिष्ट बिंदु। लेकिन OffsetDateTime
JDBC
के लिए आवश्यक समर्थन है 4.2
उन कारणों से जो मुझसे बच जाते हैं।
OffsetDateTime odtLaunchAsSeenInRome = launchMomentAsSeenInRome.toOffsetDateTime() ;
डेटाबेस में लिखा जा रहा है।
myPreparedStatement.setObject( … , odtLaunchAsSeenInRome ) ;
डेटाबेस से पुनर्प्राप्ति।
OffsetDateTime launchMoment = myResultSet.getObject( … , OffsetDateTime.class ) ;
अपने उपयोगकर्ता द्वारा वांछित न्यूयॉर्क समय क्षेत्र में समायोजित करें।
ZoneId zoneAmericaNewYork = ZoneId.of( "America/New_York" ) ;
ZonedDateTime launchAsSeenInNewYork = launchMoment.atZoneSameInstant( zoneAmericaNewYork ) ;
आप उपरोक्त सभी कोड रन को IdeOne.com पर लाइव देख सकते हैं ।
वैसे, पिछली घटनाओं को ट्रैक करना भी एक पल के रूप में माना जाता है। रोगी वास्तव में नियुक्ति के लिए कब आया, ग्राहक ने चालान का भुगतान कब किया, नए भाड़े ने अपने दस्तावेजों पर कब हस्ताक्षर किए, सर्वर कब दुर्घटनाग्रस्त हुआ ... इन सभी को यूटीसी में एक पल के रूप में ट्रैक किया जाता है। जैसा कि ऊपर चर्चा की गई है, आमतौर पर यह Instant
. होगा , हालांकि ZonedDateTime
&OffsetDateTime
एक पल का भी प्रतिनिधित्व करते हैं। डेटाबेस के लिए TIMESTAMP WITH TIME ZONE
use का उपयोग करें (नहीं WITHOUT
)।
दिन का समय
मुझे उम्मीद है कि अधिकांश व्यवसाय-उन्मुख ऐप्स दूसरे प्रकार की नियुक्तियों पर केंद्रित हैं, जहां हम एक विशिष्ट क्षण के बजाय दिन के समय के साथ एक तिथि का लक्ष्य रखते हैं।
यदि उपयोगकर्ता किसी परीक्षण के परिणामों की समीक्षा करने के लिए अपने स्वास्थ्य देखभाल प्रदाता के साथ अपॉइंटमेंट लेता है, तो वे उस तिथि को दिन के किसी विशेष समय के लिए ऐसा करते हैं। यदि इस बीच राजनेता अपने समय क्षेत्र के नियमों को बदलते हैं, घड़ी को एक घंटे या आधे घंटे या किसी अन्य समय के आगे या पीछे घुमाते हैं, तो उस चिकित्सा नियुक्ति की तिथि और समय-दिन वही रहता है। वास्तव में, राजनेताओं द्वारा समय क्षेत्र बदलने के बाद, समय-सीमा पर पहले/बाद के बिंदु पर शिफ्ट होने के बाद, मूल नियुक्ति की समय-सीमा बदल दी जाएगी।
ऐसी नियुक्तियों के लिए, हम नहीं करते हैं यूटीसी में देखे गए दिनांक और समय-समय पर स्टोर करें। हम नहीं करते हैं डेटाबेस कॉलम प्रकार का उपयोग करें TIMESTAMP WITH TIME ZONE
।
ऐसी नियुक्तियों के लिए, हम समय क्षेत्र की परवाह किए बिना तारीख को समय-समय पर संग्रहीत करते हैं। हम TIMESTAMP WITHOUT TIME ZONE
. प्रकार के डेटाबेस कॉलम का उपयोग करते हैं (नोटिस WITHOUT
के बजाय WITH
) जावा में मिलान प्रकार है LocalDateTime
।
LocalDate medicalApptDate = LocalDate.of( 2021 , 1 , 23 ) ;
LocalTime medicalApptTime = LocalTime.of( 21 , 0 ) ;
LocalDateTime medicalApptDateTime = LocalDateTime.of( medicalApptDate , medicalApptTime ) ;
इसे डेटाबेस में लिखें।
myPreparedStatement.setObject( … , medicalApptDateTime ) ;
इस पर स्पष्ट रहें:एक LocalDateTime
ऑब्जेक्ट नहीं करता है एक पल का प्रतिनिधित्व करते हैं, नहीं है समयरेखा पर एक विशिष्ट बिंदु। एक LocalDateTime
ऑब्जेक्ट संभव . की श्रेणी का प्रतिनिधित्व करता है समयरेखा के लगभग 26-27 घंटे (दुनिया भर में समय क्षेत्र की सीमा) के साथ क्षण। LocalDateTime
. को वास्तविक अर्थ देने के लिए , हमें एक इच्छित समय क्षेत्र संबद्ध करना होगा।
उस इच्छित समय क्षेत्र के लिए, ज़ोन पहचानकर्ता को संग्रहीत करने के लिए दूसरे कॉलम का उपयोग करें। उदाहरण के लिए, स्ट्रिंग्स Europe/Rome
या America/New_York
. देखें ज़ोन नामों की सूची
।
ZoneId zoneEuropeRome = ZoneId.of( "Europe/Rome" ) ;
इसे डेटाबेस में टेक्स्ट के रूप में लिखें।
myPreparedStatement.setString( … , zoneEuropeRome ) ;
पुनर्प्राप्ति। ज़ोन नाम को टेक्स्ट के रूप में पुनः प्राप्त करें, और एक ZoneId
. को इंस्टेंट करें वस्तु।
LocalDateTime medicalApptDateTime = myResultSet.getObject( … , LocalDateTime.class ) ;
ZoneId medicalApptZone = ZoneId.of( myResultSet.getString( … ) ) ;
ZonedDateTime
. के रूप में दर्शाए गए क्षण को निर्धारित करने के लिए उन दो टुकड़ों को एक साथ रखें वस्तु। इसे गतिशील रूप से करें जब आपको कैलेंडर शेड्यूल करने की आवश्यकता हो। लेकिन नहीं करें पल स्टोर करें। यदि राजनेता भविष्य में समय क्षेत्र (क्षेत्रों) को फिर से परिभाषित करते हैं, तो एक अलग क्षण की गणना की जानी चाहिए।
ZonedDateTime medicalApptAsSeenInCareProviderZone = ZonedDateTime.of( medicalApptDateTime , medicalApptZone ) ;
उपयोगकर्ता न्यूयॉर्क यूएस की यात्रा कर रहा है। उन्हें यह जानने की आवश्यकता है कि न्यूयॉर्क के अपने अस्थायी स्थान पर दीवार पर लगी घड़ियों के अनुसार मिलान इटली में स्वास्थ्य देखभाल प्रदाता को कब कॉल करना है। इसलिए एक टाइम ज़ोन से दूसरे टाइम ज़ोन में एडजस्ट करें। एक ही पल, दीवार-घड़ी का अलग समय।
ZoneId zoneAmericaNewYork = ZoneId.of( "America/New_York" ) ;
ZonedDateTime medicalApptAsSeenInNewYork = medicalApptAsSeenInCareProviderZone.withZoneSameInstant( zoneAmericaNewYork ) ;
tzdata
ध्यान रखें कि यदि आपके वांछित समय क्षेत्र के नियम बदल रहे हैं, तो आपको अपने कंप्यूटर पर समय क्षेत्र परिभाषाओं की प्रति अपडेट करनी होगी।
Java में tzdata की अपनी प्रति है। , जैसा कि Postgres डेटाबेस इंजन करता है। और आपका होस्ट ऑपरेटिंग सिस्टम भी। यहां दिखाए गए इस विशेष कोड के लिए केवल जावा को अप-टू-डेट होना आवश्यक है। यदि आप समय क्षेत्र समायोजन करने के लिए Postgres का उपयोग करते हैं, तो इसका tzdata अप-टू-डेट भी होना चाहिए। और लॉगिंग और ऐसे के लिए, आपके होस्ट ओएस को अप-टू-डेट रखा जाना चाहिए। उपयोगकर्ता द्वारा उचित घड़ी देखने के लिए, उनके क्लाइंट मशीन का OS भी अप-टू-डेट होना चाहिए।
सावधान रहें:दुनिया भर के राजनेताओं ने अपने समय क्षेत्रों को आश्चर्यजनक आवृत्ति के साथ बदलने के लिए एक रुचि दिखाई है, और अक्सर थोड़ी सी चेतावनी के साथ।
के बारे में java.time
java.time
फ्रेमवर्क जावा 8 और बाद में बनाया गया है। ये कक्षाएं पुराने विरासत
की जगह लेती हैं दिनांक-समय की कक्षाएं जैसे java.util.Date
, Calendar
, और SimpleDateFormat
।
अधिक जानने के लिए, Oracle Tutorial देखें . और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता है JSR 310 ।
जोडा-टाइम प्रोजेक्ट, अब रखरखाव मोड में , java.time कक्षाएं।
आप java.time . का आदान-प्रदान कर सकते हैं अपने डेटाबेस के साथ सीधे वस्तुओं। JDBC ड्राइवर
का उपयोग करें JDBC 4.2
के अनुरूप या बाद में। स्ट्रिंग्स की कोई आवश्यकता नहीं है, java.sql.*
. की कोई आवश्यकता नहीं है कक्षाएं। हाइबरनेट 5 और जेपीए 2.2 समर्थन java.time ।
java.time कक्षाएं कहाँ से प्राप्त करें?
- जावा एसई 8
, Java SE 9
, Java SE 10
, Java SE 11
, और बाद में - बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
- जावा 9 कुछ मामूली सुविधाएँ और सुधार लाए हैं।
- जावा एसई 6
और Java SE 7
- अधिकांश java.time कार्यक्षमता को ThreeTen-Backport में Java 6 और 7 में बैक-पोर्ट किया गया है ।
- एंड्रॉयड
- Android के बाद के संस्करण (26+) java.time . के बंडल कार्यान्वयन कक्षाएं।
- पहले के Android (<26) के लिए, एक प्रक्रिया जिसे के नाम से जाना जाता है। एपीआई डिसुगरिंग
एक java.time का सबसेट लाता है
कार्यक्षमता मूल रूप से Android में निर्मित नहीं है।
- अगर डिसुगरिंग वह नहीं देती जो आपको चाहिए, तो ThreeTenABP प्रोजेक्ट एडाप्ट करता है ThreeTen-Backport (ऊपर उल्लिखित) Android के लिए। देखें ThreeTenABP का उपयोग कैसे करें… ।