JavaScript Dates आखिरकार ठीक होने वाले हैं
(docs.timetime.in)- ECMAScript में हाल के बदलावों में सबसे ज़्यादा ध्यान खींचने वाला प्रस्ताव Temporal है
- इस API को FullCalendar टीम द्वारा दिए गए polyfill के ज़रिए पहले से इस्तेमाल किया जा सकता है
- इस API का एक बड़ा फ़ायदा यह है कि आखिरकार "Zoned Date Time" को व्यक्त करने के लिए एक native object उपलब्ध होगा
Zoned Date Time क्या है?
- मानव-पठनीय तारीखों के साथ काम करते समय हम आमतौर पर time zone छोड़े बिना तारीख और समय की बात करते हैं
- लेकिन JavaScript का
Dateobject सिर्फ़ numbers के साथ काम करता है, इसलिए मूल तारीख का अर्थ खो जाता है - उदाहरण के लिए, कार्ड पेमेंट का समय रिकॉर्ड करने के लिए बहुत से लोग इस तरह का कोड लिख सकते हैं
const paymentDate = new Date('2024-07-20T10:30:00'); - इसमें browser उपयोगकर्ता के time zone (CET) के आधार पर milliseconds की गणना करता है। लेकिन सेव की गई जानकारी को time zone के अनुसार अलग-अलग तरह से समझा जा सकता है
- JavaScript में तारीखें UTC नहीं बल्कि POSIX पर आधारित होती हैं, जहाँ leap seconds को पूरी तरह नज़रअंदाज़ किया जाता है। इसके अलावा, सिर्फ़ संख्याएँ होने पर तारीख का मूल अर्थ भी खो जाता है
- बहुत से लोग मानते हैं कि UTC के साथ काम करना या ISO format में तारीख भेजना सुरक्षित है, लेकिन तब भी जानकारी खो सकती है, इसलिए यह पूरी तरह सही नहीं है
UTC काफ़ी नहीं है
- ISO format के साथ काम करने पर भी, तारीख दिखाते समय अब भी time zone की जानकारी कम पड़ती है
- timestamp को मानव-पठनीय तारीख में बदलने वाला फ़ंक्शन injective (एक-एक) नहीं होता
- उदाहरण के लिए, अगर आप Madrid से Sydney की यात्रा करके लौटें, तो बैंक ट्रांज़ैक्शन हिस्ट्री में time zone की वजह से भ्रम पैदा हो सकता है
Temporal API का परिचय
- Temporal API, तारीख और समय को time zone सहित दर्शाने के लिए
Temporal.ZonedDateTimeobject पेश करता है - यह RFC 3339 के एक extension का प्रस्ताव करता है, जो string के रूप में तारीख को serialize और deserialize करने का मानक देता है
1996-12-19T16:39:57-08:00[America/Los_Angeles]- यह string 19 दिसंबर 1996, 16 बजकर 39 मिनट 57 सेकंड को दर्शाती है
- offset UTC से
-08:00है (Los Angeles जिस Pacific Standard Time, PST में आता है) - और time zone-aware applications के लिए संबंधित standard time zone ("Pacific Standard Time") भी अतिरिक्त रूप से निर्दिष्ट करती है
- यह कई calendar systems को support करता है (जैसे बौद्ध, चीनी, Dangi, Gregorian, इस्लामी, Persian, Japanese आदि)
बुनियादी ऑपरेशन्स
तारीख बनाना
- Temporal API, time zone को handle करने के लिए मज़बूत tools देता है
- उदाहरण के लिए,
Temporal.ZonedDateTimeobject बनाते समय यह सुनिश्चित करता है कि time zone सही तरह से परिलक्षित होconst zonedDateTime = Temporal.ZonedDateTime.from({ year: 2024, month: 8, day: 16, hour: 12, minute: 30, second: 0, timeZone: 'Europe/Madrid'}); - इससे time zone बदलने या DST जैसी local time adjustments होने पर भी सही समय बना रहता है
तारीख की तुलना
ZonedDateTimeobjectcomparemethod देता है, जिससे दोZonedDateTimeमानों की तुलना की जा सकती हैconst one = Temporal.ZonedDateTime.from('2020-11-01T01:45-07:00[America/Los_Angeles]'); const two = Temporal.ZonedDateTime.from('2020-11-01T01:15-08:00[America/Los_Angeles]'); Temporal.ZonedDateTime.compare(one, two); // => -1
उपयोगी built-in सुविधाएँ
hoursInDayproperty उस दिन के वास्तविक घंटों की संख्या लौटाती हैTemporal.ZonedDateTime.from('2020-03-08T12:00-07:00[America/Los_Angeles]').hoursInDay; // => 23 (DST शुरू होने का दिन)
time zone conversion
withTimeZonemethod का उपयोग करकेZonedDateTimeका time zone बदला जा सकता हैzdt = Temporal.ZonedDateTime.from('1995-12-07T03:24:30+09:00[Asia/Tokyo]'); zdt.withTimeZone('Africa/Accra').toString(); // => '1995-12-06T18:24:30+00:00[Africa/Accra]'
बुनियादी arithmetic operations
.addmethod का उपयोग करके DST नियमों के अनुसार तारीख जोड़ी या घटाई जा सकती हैzdt = Temporal.ZonedDateTime.from('2020-03-08T00:00-08:00[America/Los_Angeles]'); laterDay = zdt.add({ days: 1 }); // => 2020-03-09T00:00:00-07:00[America/Los_Angeles]
तारीखों के बीच अंतर निकालना
.untilmethod दो समयों के बीच का अंतर निकालती है औरTemporal.Durationobject के रूप में लौटाती है- उदाहरण के लिए, इसे
zdt.until(other)की तरह इस्तेमाल किया जा सकता है
- उदाहरण के लिए, इसे
निष्कर्ष
- Temporal API, JavaScript में समय को handle करने के तरीके को क्रांतिकारी रूप से बदल देता है
- इस लेख में मानव-पठनीय तारीख और UTC तारीख के बीच का अंतर, और
Temporal.ZonedDateTimeobject का उपयोग करके उसे सही ढंग से व्यक्त करने का तरीका समझाया गया है - अगले लेख में Instant, PlainDate, Duration जैसे अन्य रोचक objects को देखा जाएगा
GN⁺ की राय
- JavaScript डेवलपर्स के लिए लंबे समय से मुश्किल बने हुए date और time handling के मुद्दे Temporal API से हल हो सकते हैं
- यह time zone और DST समस्याओं को अपने आप handle कर सकता है, इसलिए global applications बनाते समय बहुत उपयोगी है
- मौजूदा
Dateobject के साथ compatibility और migration से जुड़े मुद्दे अब भी ध्यान देने योग्य हैं TemporalAPI को साफ़ और intuitive तरीके से डिज़ाइन किया गया है, और यह कई calendar systems को support करता है, इसलिए internationalization के लिहाज़ से भी मज़बूत है- उम्मीद है कि यह बदलाव JavaScript डेवलपर्स की productivity को काफ़ी बढ़ाएगा
5 टिप्पणियां
आख़िरकार!
जानकारी के लिए, Deno में Temporal API पहले से ही built-in है।
वाह, बड़े global service डिज़ाइन करते समय dates की वजह से हमेशा सिरदर्द रहता था
इसे एक बार आज़माकर देखना चाहूंगा
सच में, क्या अब आखिरकार moment या dayjs का इस्तेमाल किए बिना काम चल जाएगा?
Hacker News राय
Javascript में तारीख और समय को संभालना बहुत कठिन है
उम्मीद है कि नया API, JS की time zone समस्याओं को हल करेगा
timestamp को इंसानों द्वारा पढ़ी जा सकने वाली तारीख में बदलने वाला function injective नहीं होता
समय को संभालने की कठिनाई पर एक मज़ाक
अगर भविष्य की तारीखों वाले और उदाहरण इस्तेमाल किए जाते, तो लेख अधिक प्रभावशाली होता
समय प्रबंधन को न समझ पाने से चिंतित एक उपयोगकर्ता
अच्छा datetime standard होना आधी लड़ाई जीतने जैसा है
ISO date string को सटीक जानकारी capture करनी चाहिए
Postgres में इस समस्या को कैसे संभालना चाहिए, यह सवाल
इस बात के पर्याप्त सबूत नहीं हैं कि Temporal वास्तव में अपनाया जाएगा