दिनांक-समय एक मान है
सॉफ़्टवेयर में दिनांक-समय मान लगभग हमेशा एकल मानों के रूप में ट्रैक किए जाते हैं। तकनीकी रूप से उन्हें एक युग से सेकंड/मिलीसेकंड/माइक्रोसेकंड/नैनोसेकंड की गणना के रूप में आंतरिक रूप से दर्शाया जाता है ।
आप उपयोगकर्ता इंटरफ़ेस में अलग-अलग दिनांक और समय प्रस्तुत करना चाह सकते हैं, लेकिन आंतरिक रूप से नहीं।
इसके अलावा, आपको लगभग निश्चित रूप से समय क्षेत्र के बारे में सोचना चाहिए। भोले प्रोग्रामर अक्सर सोचते हैं कि वे समय क्षेत्रों को अनदेखा कर सकते हैं, लेकिन बाद में पीड़ा का कारण बनना लगभग तय है।
अपने डेटाबेस की दिनांक-समय की हैंडलिंग को समझें
अलग-अलग डेटाबेस अलग-अलग दिनांक-समय को संभालते हैं। अत्यंत महत्वपूर्ण है कि आप दस्तावेज़ पढ़ें, खेलें, प्रयोग करें, और सीखें कि आपका डेटाबेस कैसे काम करता है।
पोस्टग्रेज दिनांक-समय की उत्कृष्ट और समझदार हैंडलिंग है। यदि आप किसी अन्य डेटाबेस का उपयोग करते हैं, तो भी date- पर उत्कृष्ट पोस्टग्रेज़ दस्तावेज़ीकरण देखें। समय डेटा प्रकार और डेट-टाइम फ़ंक्शंस (आदेश) विभिन्न मुद्दों के बारे में जानने के लिए और एसक्यूएल मानक बनाम आपके डेटाबेस के लिए विशिष्ट के बारे में क्या परिभाषित किया गया है।
वैश्विक रूप से स्टोर करें, स्थानीय रूप से प्रस्तुत करें
दिनांक-समय आश्चर्यजनक रूप से फिसलन भरी और जटिल समस्या है। समस्या पर नियंत्रण रखने की एक कुंजी UTC में काम कर रही है। . यूटीसी में अपने दिनांक-समय मानों को डेटाबेस में (या क्रमबद्ध फाइलों, या एक्सएमएल/जेएसओएन संचार में) स्टोर करें। यूटीसी में अपना अधिकांश व्यावसायिक तर्क लिखें, सिवाय इसके कि स्थानीय समय क्षेत्र मायने रखता है जैसे कि "एक नए दिन की शुरुआत" को परिभाषित करना।
जब आप उपयोगकर्ता को प्रस्तुत करते हैं, तो या तो आईएसओ 8601 प्रारूप का उपयोग करें या अपने स्वयं के समय क्षेत्र (या वे जिस समय क्षेत्र की अपेक्षा करते हैं) को स्थानीयकृत करें। यह अंतर्राष्ट्रीयकरण/स्थानीयकरण के मूल विचार का अनुसरण करता है। टेक्स्ट मानों के लिए, आप अपने कोड में कुछ मुख्य स्ट्रिंग्स का उपयोग करते हैं। उपयोगकर्ता इंटरफ़ेस में प्रस्तुत करने पर, आप उन आंतरिक स्ट्रिंग्स को उपयोगकर्ता इंटरफ़ेस के लिए स्थानीयकृत (अनुवादित) टेक्स्ट मानों में मैप करते हैं। कुछ दिनांक-समय के साथ:यूटीसी आंतरिक रूप से, उपयोगकर्ता इंटरफ़ेस में स्थानीय समय क्षेत्र।
एक चेतावनी:आप भी इतिहास के लिए स्थानीय दिनांक-समय संग्रहीत करें। राजनेताओं और नौकरशाहों के कारण समय क्षेत्र के नियम बार-बार बदलते रहते हैं। आपके सॉफ़्टवेयर का समय क्षेत्र डेटाबेस पुराना हो सकता है। तो हो सकता है कि आप उस चीज़ को स्टोर करना चाहें जिसे आप या उपयोगकर्ता एक निश्चित दिनांक-समय के रूप में मानते हैं तब . लेकिन उस पर भरोसा मत करो; UTC मान निर्धारित और संग्रहीत करें।
युक्ति:24 घंटे के समय में सोचना और पढ़ना सीखें। एक प्रोग्रामर/डीबगर/sysadmin के रूप में आपका जीवन कुछ अधिक आसान और कम त्रुटि-प्रवण हो जाएगा।
जोडा-टाइम या java.time
Java.util.Date और .Calendar क्लास को Java के साथ बंडल किया गया है जो बेहद परेशानी भरा है। उनसे बचें।
इसके बजाय या तो Joda-Time का उपयोग करें या नया java.time पैकेज जावा 8 में निर्मित (जोडा-टाइम से प्रेरित, जेएसआर 310 द्वारा परिभाषित)।
दोनों पुस्तकालय आईएसओ 8601 प्रारूपों को अपने डिफ़ॉल्ट के रूप में उपयोग करते हैं, दोनों स्ट्रिंग्स को पार्स करने और उत्पन्न करने के लिए।
ISO 8601
ISO 8601 विशिष्ट और गैर-अस्पष्ट पाठ प्रारूपों में दिनांक-समय मान, समय क्षेत्र और ऑफ़सेट, अवधि, और अवधियों को प्रस्तुत करने का तरीका परिभाषित करने वाला एक समझदार मानक है। उस अच्छी तरह से लिखे गए विकिपीडिया पेज का अध्ययन करें।
विशेष रूप से नोट करें कि मानक क्या कहते हैं अवधि
. समय की अवधि को इस प्रारूप में परिभाषित किया गया है:PnYnMnDTnHnMnS
जहां P
का अर्थ है "अवधि", T
दिनांक भाग को समय भाग से अलग करता है, और अन्य वैकल्पिक भाग अंक + अक्षर हैं। आधे घंटे का अपॉइंटमेंट PT30M
होगा . यह आपके लिए आसान हो सकता है, जैसे मेरे ईआरडी
नीचे। जोडा-टाइम में, पीरियड क्लास अपने महीनों, दिनों, घंटों आदि को ट्रैक करके समय की अवधि का प्रतिनिधित्व करता है, और जानता है कि इस प्रारूप में स्ट्रिंग्स को पार्स और जेनरेट दोनों कैसे करें।
आधा खुला
आप नियुक्तियों को दो तरीकों में से किसी एक में संग्रहित करना चुन सकते हैं। एक तरीका प्रारंभ दिनांक-समय और एक अवधि (90 मिनट, 20 मिनट, आदि) है। दूसरा तरीका यह है कि प्रारंभ और समाप्ति दिनांक-समय दोनों को रिकॉर्ड किया जाए। इस मामले में, सामान्य और आम तौर पर सर्वोत्तम दृष्टिकोण को "हाफ-ओपन" कहा जाता है। इसका मतलब है कि शुरुआत समावेशी है जबकि अंत अनन्य है .
उदाहरण के लिए, घंटे पर एक घंटे का अपॉइंटमेंट 11:00 बजे से 12:00 बजे तक चलेगा, जिसका अर्थ है "सुबह 11 बजे से शुरू होकर अगले घंटे (दोपहर) के पहले क्षण तक चल रहा है, लेकिन इसमें शामिल नहीं है"। अगला अपॉइंटमेंट 12:00 से 13:00 बजे तक चलेगा।
अधिक चर्चा और उदाहरण और आरेख खोजने के लिए "हाफ-ओपन" के लिए StackOverflow खोजें।
अनेक-से-अनेक
रोगी . के बीच संबंध और डॉक्टर जिसे हम Many-To-Many कहते हैं . एक डॉक्टर कई रोगियों को देखता है, और एक रोगी एक से अधिक डॉक्टरों को देख सकता है। सुनिश्चित करें कि आप रिलेशनल डेटाबेस डिज़ाइन में कई-से-अनेक तालिकाओं के बारे में जानते हैं। समाधान हमेशा तीसरी तालिका जोड़ने के लिए होता है, जिसे कभी-कभी "पुल" तालिका कहा जाता है जो अन्य माता-पिता दोनों तालिकाओं के लिए एक बाल तालिका के रूप में कार्य करता है। आपके मामले में, नियुक्ति टेबल ब्रिज टेबल है।
आपको यह जानने की आवश्यकता होगी कि अनेक-से-अनेक संबंधों में जॉइन कैसे करें।
प्रत्यक्ष SQL
यदि आप प्रोग्रामिंग में नए हैं या रिलेशनल डेटाबेस में नए हैं, तो मेरा सुझाव है कि हाइबरनेट से बचें। आपको वास्तव में समझना चाहिए कि क्या हो रहा है। हाइबरनेट के कुछ उपयुक्त उपयोग हैं। लेकिन अगर आपको लगता है कि हाइबरनेट जादुई रूप से डेटाबेस की समस्याओं को गायब कर देगा, तो आप निराश होंगे।
विशेषताएं
गुण आप पर निर्भर हैं। वे उस व्यवसाय (या गृहकार्य?) समस्या पर निर्भर करते हैं जिसे आप हल करने का प्रयास कर रहे हैं। आपके पास मूल बातें सही हैं।
अपॉइंटमेंट-शेड्यूलिंग एक बहुत ही कठिन व्यावसायिक समस्या है जिसके लिए सॉफ्टवेयर लिखना है। उदाहरण के लिए, क्या आप केवल की जा रही नियुक्तियों को रिकॉर्ड कर रहे हैं? या आप पूर्वनिर्धारित समय स्लॉट बनाकर डॉक्टरों की उपलब्धता पर नज़र रख रहे हैं, और यदि ऐसा है तो आप प्रत्येक डॉक्टर के कैलेंडर में अपवादों और परिवर्तनों को कैसे संभालते हैं? आपको बहुत विशिष्ट आवश्यकताओं और उपयोग-मामलों को लिखने की आवश्यकता है। उपयोगकर्ताओं की अपेक्षाओं के लिए आपकी अपेक्षित आवश्यकताओं को पार करना बहुत आसान है।
यहाँ एक सरल दृश्य है।