जावास्क्रिप्ट के टेम्परल API का उपयोग कर सटीक समय अंतराल गणना के लिए एक गाइड, जिसमें ड्यूरेशन निर्माण, अंकगणित और स्वरूपण शामिल हैं।
जावास्क्रिप्ट टेम्परल ड्यूरेशन: समय अंतराल गणना में महारत हासिल करना
जावास्क्रिप्ट का टेम्परल API तिथियों, समयों और समय अंतरालों को संभालने का एक आधुनिक और शक्तिशाली तरीका प्रस्तुत करता है। Temporal.Duration
ऑब्जेक्ट समय की लंबाई का प्रतिनिधित्व करता है, जो समय अंतरालों के साथ गणना करने के लिए एक स्पष्ट और सहज दृष्टिकोण प्रदान करता है। यह लेख Temporal.Duration
के विवरण में गहराई से जाता है, यह दर्शाता है कि विभिन्न उपयोग मामलों के लिए ड्यूरेशन कैसे बनाएं, उनमें हेरफेर करें और उन्हें प्रारूपित करें।
टेम्परल.ड्यूरेशन क्या है?
Temporal.Duration
समय की एक अवधि का प्रतिनिधित्व करता है, इसे वर्षों, महीनों, दिनों, घंटों, मिनटों, सेकंड और सेकंड के अंशों (मिलीसेकंड, माइक्रोसेकंड, नैनोसेकंड) के संदर्भ में व्यक्त करता है। Date
ऑब्जेक्ट्स के विपरीत जो समय में एक विशिष्ट बिंदु का प्रतिनिधित्व करते हैं, Temporal.Duration
समय की मात्रा का प्रतिनिधित्व करता है। यह ISO 8601 ड्यूरेशन प्रारूप (जैसे, P1Y2M10DT2H30M
1 वर्ष, 2 महीने, 10 दिन, 2 घंटे और 30 मिनट का प्रतिनिधित्व करता है) का पालन करता है। टेम्परल API को पुराने Date
ऑब्जेक्ट की तुलना में अधिक सहज और कम त्रुटि-प्रवण होने के लिए डिज़ाइन किया गया है।
टेम्परल.ड्यूरेशन ऑब्जेक्ट्स बनाना
Temporal.Duration
ऑब्जेक्ट बनाने के कई तरीके हैं:
1. एक प्लेन ऑब्जेक्ट से
आप वांछित गुणों के साथ एक ऑब्जेक्ट पास करके एक ड्यूरेशन बना सकते हैं:
const duration = new Temporal.Duration(1, 2, 10, 2, 30, 0, 0, 0);
console.log(duration.toString()); // आउटपुट: P1Y2M10DT2H30M
यह 1 वर्ष, 2 महीने, 10 दिन, 2 घंटे और 30 मिनट की अवधि बनाता है। ध्यान दें कि तर्क निम्नलिखित क्रम के अनुरूप हैं: years
, months
, weeks
, days
, hours
, minutes
, seconds
, milliseconds
, microseconds
, nanoseconds
।
2. एक ISO 8601 स्ट्रिंग से
आप Temporal.Duration.from()
का उपयोग करके एक ISO 8601 ड्यूरेशन स्ट्रिंग से भी एक ड्यूरेशन बना सकते हैं:
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
console.log(duration.toString()); // आउटपुट: P1Y2M10DT2H30M
यह विशेष रूप से तब उपयोगी होता है जब स्ट्रिंग प्रारूप में संग्रहीत या किसी बाहरी स्रोत से प्राप्त ड्यूरेशन के साथ काम कर रहे हों।
3. Temporal.Instant
, Temporal.ZonedDateTime
, आदि के साथ add()
और subtract()
विधियों का उपयोग करना।
जब आप अन्य टेम्परल प्रकारों (जैसे Temporal.Instant
या Temporal.ZonedDateTime
) से Temporal.Duration
जोड़ते या घटाते हैं, तो एक Temporal.Duration
लौटाया जाता है जो समय के दो बिंदुओं के बीच के अंतर का प्रतिनिधित्व करता है यदि आप फिर उन्हें घटाते हैं। उदाहरण के लिए:
const now = Temporal.Now.zonedDateTimeISO();
const later = now.add({ hours: 5 });
const duration = later.since(now);
console.log(duration.toString()); // आउटपुट: PT5H
ड्यूरेशन घटकों तक पहुँचना
आप इसके गुणों का उपयोग करके Temporal.Duration
ऑब्जेक्ट के व्यक्तिगत घटकों तक पहुँच सकते हैं:
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
console.log(duration.years); // आउटपुट: 1
console.log(duration.months); // आउटपुट: 2
console.log(duration.days); // आउटपुट: 10
console.log(duration.hours); // आउटपुट: 2
console.log(duration.minutes); // आउटपुट: 30
console.log(duration.seconds); // आउटपुट: 0
console.log(duration.milliseconds); // आउटपुट: 0
console.log(duration.microseconds); // आउटपुट: 0
console.log(duration.nanoseconds); // आउटपुट: 0
ड्यूरेशन के साथ अंकगणित करना
Temporal.Duration
ऑब्जेक्ट्स add()
और subtract()
विधियों का उपयोग करके जोड़ और घटाव का समर्थन करते हैं। ये विधियाँ ऑपरेशन के परिणाम का प्रतिनिधित्व करने वाला एक नया Temporal.Duration
ऑब्जेक्ट लौटाती हैं।
const duration1 = Temporal.Duration.from("P1Y2M");
const duration2 = Temporal.Duration.from("P3M4D");
const addedDuration = duration1.add(duration2);
console.log(addedDuration.toString()); // आउटपुट: P1Y5M4D
const subtractedDuration = duration1.subtract(duration2);
console.log(subtractedDuration.toString()); // आउटपुट: P10M26D
आप अधिक जटिल गणनाओं के लिए इन विधियों को चेन भी कर सकते हैं:
const duration = Temporal.Duration.from("P1D").add({ hours: 12 }).subtract({ minutes: 30 });
console.log(duration.toString()); // आउटपुट: P1DT11H30M
negated()
विधि सभी घटकों को नकारे हुए एक नया Temporal.Duration
ऑब्जेक्ट लौटाती है:
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const negatedDuration = duration.negated();
console.log(negatedDuration.toString()); // आउटपुट: -P1Y2M10DT2H30M
abs()
विधि सभी घटकों को धनात्मक मानों (निरपेक्ष मानों) के रूप में एक नया Temporal.Duration
ऑब्जेक्ट लौटाती है:
const duration = Temporal.Duration.from("-P1Y2M10DT2H30M");
const absoluteDuration = duration.abs();
console.log(absoluteDuration.toString()); // आउटपुट: P1Y2M10DT2H30M
with()
विधि आपको कुछ, या सभी, गुणों को नए मानों में बदलकर एक नया Temporal.Duration
इंस्टेंस बनाने की अनुमति देती है। यदि तर्क ऑब्जेक्ट में कोई मान निर्दिष्ट नहीं है, तो ड्यूरेशन के मूल मान का उपयोग किया जाएगा। उदाहरण के लिए:
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const newDuration = duration.with({ years: 2, days: 5 });
console.log(newDuration.toString()); // आउटपुट: P2Y2M5DT2H30M
ड्यूरेशन को सामान्य बनाना
ड्यूरेशन को कभी-कभी एक गैर-सामान्यीकृत रूप में व्यक्त किया जा सकता है (उदाहरण के लिए, P1Y12M
, जिसे P2Y
तक सरल किया जा सकता है)। normalized()
विधि एक ड्यूरेशन को उसके सबसे संक्षिप्त रूप में सरल बनाने का प्रयास करती है। हालाँकि, इसे महीनों की अलग-अलग लंबाई की जटिलताओं को संभालने के लिए एक संदर्भ तिथि की आवश्यकता होती है। ठीक से सामान्य बनाने के लिए, आपको एक Temporal.PlainDate
, Temporal.ZonedDateTime
, या Temporal.Instant
इंस्टेंस की आवश्यकता होगी।
उदाहरण के लिए, महीनों और दिनों से जुड़ी ड्यूरेशन को सामान्य बनाने के लिए एक संदर्भ तिथि की आवश्यकता होती है:
const duration = Temporal.Duration.from("P1M32D");
const referenceDate = Temporal.PlainDate.from("2024-01-01");
const normalizedDuration = duration.normalized({ relativeTo: referenceDate });
console.log(normalizedDuration.toString()); // आउटपुट: P2M1D
इस उदाहरण में, ड्यूरेशन P1M32D
को 1 जनवरी, 2024 के सापेक्ष सामान्य किया गया है, जिसके परिणामस्वरूप P2M1D
होता है क्योंकि जनवरी में 31 दिन होते हैं।
यदि आप केवल समय घटकों (घंटे, मिनट, सेकंड, आदि) के साथ काम कर रहे हैं, तो आप संदर्भ तिथि के बिना सामान्य कर सकते हैं:
const duration = Temporal.Duration.from("PT25H61M");
const normalizedDuration = duration.normalized({ relativeTo: null }); //या relativeTo तर्क को छोड़ दें
console.log(normalizedDuration.toString()); // आउटपुट: P1DT2H1M
ड्यूरेशन की तुलना करना
आप compare()
विधि का उपयोग करके ड्यूरेशन की तुलना कर सकते हैं। यह विधि लौटाती है:
- -1 यदि पहली ड्यूरेशन दूसरी ड्यूरेशन से छोटी है।
- 0 यदि ड्यूरेशन बराबर हैं।
- 1 यदि पहली ड्यूरेशन दूसरी ड्यूरेशन से लंबी है।
const duration1 = Temporal.Duration.from("P1Y");
const duration2 = Temporal.Duration.from("P6M");
const comparisonResult = Temporal.Duration.compare(duration1, duration2);
console.log(comparisonResult); // आउटपुट: 1
व्यावहारिक उदाहरण
1. किसी घटना तक का समय गणना करना
मान लीजिए कि आप किसी विशिष्ट घटना तक शेष समय की गणना करना चाहते हैं। वर्तमान समय प्राप्त करने के लिए Temporal.Now.zonedDateTimeISO()
का उपयोग करें, और घटना की तारीख घटाएं। यदि घटना की तारीख बीत चुकी है, तो आउटपुट नकारात्मक होगा।
const eventDate = Temporal.ZonedDateTime.from({ timeZone: 'America/Los_Angeles', year: 2024, month: 12, day: 25, hour: 9, minute: 0, second: 0 });
const now = Temporal.Now.zonedDateTimeISO('America/Los_Angeles');
const durationUntilEvent = eventDate.since(now);
console.log(durationUntilEvent.toString()); // आउटपुट: उदा., P262DT14H30M (वर्तमान दिनांक और समय के आधार पर)
2. प्रोजेक्ट कार्य अवधियों को ट्रैक करना
परियोजना प्रबंधन में, आप कार्यों की अनुमानित या वास्तविक अवधि को ट्रैक करने के लिए Temporal.Duration
का उपयोग कर सकते हैं।
const task1EstimatedDuration = Temporal.Duration.from("PT8H"); // 8 घंटे
const task2EstimatedDuration = Temporal.Duration.from("PT16H"); // 16 घंटे
const totalEstimatedDuration = task1EstimatedDuration.add(task2EstimatedDuration);
console.log(`कुल अनुमानित अवधि: ${totalEstimatedDuration.toString()}`); // आउटपुट: कुल अनुमानित अवधि: P1DT
3. आयु की गणना
हालांकि आयु की सटीक गणना के लिए लीप वर्ष और समय क्षेत्रों पर विचार करने की आवश्यकता होती है, Temporal.Duration
एक उचित अनुमान प्रदान कर सकता है:
const birthDate = Temporal.PlainDate.from("1990-05-15");
const currentDate = Temporal.PlainDate.from("2024-01-20");
const ageDuration = currentDate.since(birthDate, { smallestUnit: 'years' });
console.log(`अनुमानित आयु: ${ageDuration.years} वर्ष`); // आउटपुट: अनुमानित आयु: 33 years
4. मानव-पठनीय ड्यूरेशन प्रदर्शित करना
अक्सर, आपको ड्यूरेशन को मानव-पठनीय प्रारूप में प्रदर्शित करने की आवश्यकता होती है। जबकि Temporal.Duration
में अंतर्निहित स्वरूपण फ़ंक्शन नहीं होते हैं, आप कस्टम स्वरूपण तर्क बना सकते हैं:
function formatDuration(duration) {
const parts = [];
if (duration.years) parts.push(`${duration.years} year${duration.years > 1 ? 's' : ''}`);
if (duration.months) parts.push(`${duration.months} month${duration.months > 1 ? 's' : ''}`);
if (duration.days) parts.push(`${duration.days} day${duration.days > 1 ? 's' : ''}`);
if (duration.hours) parts.push(`${duration.hours} hour${duration.hours > 1 ? 's' : ''}`);
if (duration.minutes) parts.push(`${duration.minutes} minute${duration.minutes > 1 ? 's' : ''}`);
if (duration.seconds) parts.push(`${duration.seconds} second${duration.seconds > 1 ? 's' : ''}`);
return parts.join(', ');
}
const duration = Temporal.Duration.from("P1Y2M10DT2H30M");
const formattedDuration = formatDuration(duration);
console.log(formattedDuration); // आउटपुट: 1 year, 2 months, 10 days, 2 hours, 30 minutes
उन्नत उपयोग और विचार
1. समय क्षेत्र हैंडलिंग
जब समय अंतरालों से निपटते हैं जो समय क्षेत्र की सीमाओं या डेलाइट सेविंग टाइम संक्रमणों को पार करते हैं, तो सटीक गणना सुनिश्चित करने के लिए Temporal.ZonedDateTime
का उपयोग करना महत्वपूर्ण है। Temporal.PlainDate
और Temporal.PlainTime
का उपयोग करने से किसी भी समय क्षेत्र रूपांतरण से बचा जा सकेगा।
2. सबसे छोटी इकाई और राउंडिंग
`since()` और `until()` विधियाँ अक्सर परिणामी अवधि के लिए सबसे छोटी इकाई को परिभाषित करने के लिए विकल्प स्वीकार करती हैं। उदाहरण के लिए, किसी घटना तक के समय की गणना करना और परिणामों को दिनों तक सीमित करना।
const eventDate = Temporal.PlainDate.from("2024-12-25");
const now = Temporal.PlainDate.from("2024-01-20");
const durationUntilEvent = now.until(eventDate, { smallestUnit: 'days' });
console.log(durationUntilEvent.toString()); //उदाहरण आउटपुट PT340D
3. लीप सेकंड
टेम्परल मूल रूप से लीप सेकंड का हिसाब नहीं रखता है। यदि आपको अत्यधिक सटीकता की आवश्यकता है, तो आपको लीप सेकंड को अलग से संभालना होगा।
4. IANA समय क्षेत्र
टेम्परल API, IANA (इंटरनेट असाइन्ड नंबर्स अथॉरिटी) समय क्षेत्र डेटाबेस पर निर्भर करता है। सुनिश्चित करें कि आपके वातावरण में समय क्षेत्र रूपांतरणों को सटीक रूप से संभालने के लिए IANA डेटाबेस का एक अद्यतित संस्करण है।
सर्वोत्तम प्रथाएं
- ड्यूरेशन स्ट्रिंग्स के लिए ISO 8601 प्रारूप का उपयोग करें: यह स्थिरता और अंतर-संचालनीयता सुनिश्चित करता है।
- उपयुक्त टेम्परल प्रकार चुनें: आपको समय क्षेत्र समर्थन की आवश्यकता है या नहीं, इस आधार पर
Temporal.PlainDate
,Temporal.PlainTime
,Temporal.ZonedDateTime
, याTemporal.Instant
का उपयोग करें। - आवश्यक होने पर ड्यूरेशन को सामान्य करें: सामान्यीकरण ड्यूरेशन को सरल बनाता है और उनकी तुलना करना आसान बनाता है।
- समय क्षेत्रों को सावधानी से संभालें: समय क्षेत्र रूपांतरण जटिल हो सकते हैं, इसलिए
Temporal.ZonedDateTime
का उपयोग करें और डेलाइट सेविंग टाइम संक्रमणों से अवगत रहें। - सबसे छोटी इकाई पर विचार करें: ड्यूरेशन की गणना करते समय, वांछित स्तर की सटीकता प्राप्त करने के लिए सबसे छोटी इकाई निर्दिष्ट करें।
- यूनिट टेस्ट लिखें: यह सुनिश्चित करने के लिए अपने कोड का अच्छी तरह से परीक्षण करें कि ड्यूरेशन की गणना सटीक है।
सामान्य गलतियाँ
- समय क्षेत्रों को अनदेखा करना: समय क्षेत्रों का हिसाब न रखने से गलत ड्यूरेशन गणना हो सकती है, खासकर जब विभिन्न स्थानों में घटनाओं से निपटना हो।
- पुराने Date ऑब्जेक्ट का उपयोग करना: पुराना
Date
ऑब्जेक्ट अपनी विचित्रताओं और विसंगतियों के लिए जाना जाता है। अधिक विश्वसनीय तिथि और समय प्रबंधन के लिए टेम्परल API को प्राथमिकता दें। - ड्यूरेशन को सामान्य न करना: ड्यूरेशन को सामान्य न करने से तुलना और गणना अधिक जटिल हो सकती है।
- गलत ISO 8601 प्रारूप: अमान्य ISO 8601 ड्यूरेशन स्ट्रिंग का उपयोग करने से त्रुटियाँ हो सकती हैं।
विभिन्न संस्कृतियों में वास्तविक दुनिया के उपयोग के मामले
टेम्परल API वैश्विक अनुप्रयोगों में विशेष रूप से फायदेमंद हो सकता है जहां समय क्षेत्र के अंतर और सांस्कृतिक बारीकियां महत्वपूर्ण हैं। यहाँ कुछ उदाहरण हैं:
- वैश्विक कार्यक्रम निर्धारण: कई समय क्षेत्रों में कार्यक्रमों का सटीक निर्धारण, डेलाइट सेविंग टाइम संक्रमणों को ध्यान में रखते हुए। उदाहरण के लिए, एक वेबिनार शेड्यूल करना जो सुबह 9:00 बजे PST पर शुरू होता है और CET, JST, और AEDT जैसे विभिन्न समय क्षेत्रों में संबंधित प्रारंभ समय प्रदर्शित करता है।
- अंतर्राष्ट्रीय यात्रा योजना: यात्रा की अवधि की गणना, जिसमें लेओवर और समय क्षेत्र परिवर्तन शामिल हैं। यह यात्रा कार्यक्रम बनाने और उड़ान अनुसूचियों के प्रबंधन के लिए उपयोगी है। उदाहरण के लिए, न्यूयॉर्क से टोक्यो तक की कुल यात्रा समय की गणना, जिसमें लंदन में एक लेओवर शामिल है और समय क्षेत्र के अंतर के लिए समायोजन किया गया है।
- वैश्विक ई-कॉमर्स: उपयोगकर्ता के स्थानीय समय क्षेत्र में अनुमानित डिलीवरी समय प्रदर्शित करना। इसके लिए मूल समय क्षेत्र, शिपिंग अवधि और गंतव्य समय क्षेत्र पर विचार करने की आवश्यकता होती है। उदाहरण के लिए, जर्मनी के एक गोदाम से ऑस्ट्रेलिया में एक ग्राहक को भेजा गया एक आइटम, जिसकी अनुमानित डिलीवरी का समय 7 दिन है, जो ग्राहक के स्थानीय समय में प्रदर्शित होता है।
- सीमा पार वित्तीय लेनदेन: विभिन्न क्षेत्रों में ब्याज संचय या भुगतान की समय सीमा की सटीक गणना। इसमें अक्सर प्रत्येक देश में अलग-अलग व्यावसायिक दिनों और छुट्टियों पर विचार करना शामिल होता है। उदाहरण के लिए, सिंगापुर में एक ऋण पर अर्जित ब्याज की गणना, सिंगापुर की सार्वजनिक छुट्टियों को ध्यान में रखते हुए।
- बहुसांस्कृतिक कैलेंडर अनुप्रयोग: विभिन्न कैलेंडर प्रणालियों, जैसे कि इस्लामी या हिब्रू कैलेंडर, का समर्थन करना और इन कैलेंडरों के आधार पर घटना की अवधि और अनुस्मारक की सटीक गणना करना।
- वैश्विक परियोजना प्रबंधन: वितरित टीमों में परियोजना कार्य की अवधि और समय-सीमा पर नज़र रखना, विभिन्न कार्य शेड्यूल और समय क्षेत्रों को ध्यान में रखते हुए।
निष्कर्ष
Temporal.Duration
जावास्क्रिप्ट में समय अंतरालों के साथ काम करने का एक मजबूत और सहज तरीका प्रदान करता है। इसकी विशेषताओं और सर्वोत्तम प्रथाओं को समझकर, आप अपने अनुप्रयोगों में आत्मविश्वास से सटीक और विश्वसनीय ड्यूरेशन गणना कर सकते हैं। टेम्परल API को अपनाने से स्वच्छ, अधिक रखरखाव योग्य कोड बनता है और पुराने दिनांक और समय प्रबंधन से जुड़ी त्रुटियों का जोखिम कम होता है।
जैसे-जैसे आप टेम्परल API में गहराई से उतरते हैं, आधिकारिक दस्तावेज़ीकरण से परामर्श करना याद रखें और इसकी क्षमताओं को पूरी तरह से समझने के लिए विभिन्न परिदृश्यों के साथ प्रयोग करें। अपने आधुनिक डिजाइन और व्यापक विशेषताओं के साथ, टेम्परल जावास्क्रिप्ट में हमारे द्वारा तिथियों, समयों और ड्यूरेशन को संभालने के तरीके में क्रांति लाने के लिए तैयार है।