16 पॉइंट द्वारा GN⁺ 2024-08-25 | 5 टिप्पणियां | WhatsApp पर शेयर करें
  • ECMAScript में हाल के बदलावों में सबसे ज़्यादा ध्यान खींचने वाला प्रस्ताव Temporal है
    • इस API को FullCalendar टीम द्वारा दिए गए polyfill के ज़रिए पहले से इस्तेमाल किया जा सकता है
    • इस API का एक बड़ा फ़ायदा यह है कि आखिरकार "Zoned Date Time" को व्यक्त करने के लिए एक native object उपलब्ध होगा

Zoned Date Time क्या है?

  • मानव-पठनीय तारीखों के साथ काम करते समय हम आमतौर पर time zone छोड़े बिना तारीख और समय की बात करते हैं
  • लेकिन JavaScript का Date object सिर्फ़ 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.ZonedDateTime object पेश करता है
  • यह 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.ZonedDateTime object बनाते समय यह सुनिश्चित करता है कि 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 होने पर भी सही समय बना रहता है
तारीख की तुलना
  • ZonedDateTime object compare method देता है, जिससे दो 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 सुविधाएँ
  • hoursInDay property उस दिन के वास्तविक घंटों की संख्या लौटाती है
    Temporal.ZonedDateTime.from('2020-03-08T12:00-07:00[America/Los_Angeles]').hoursInDay;  // => 23  (DST शुरू होने का दिन)  
    
time zone conversion
  • withTimeZone method का उपयोग करके 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
  • .add method का उपयोग करके 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]  
    
तारीखों के बीच अंतर निकालना
  • .until method दो समयों के बीच का अंतर निकालती है और Temporal.Duration object के रूप में लौटाती है
    • उदाहरण के लिए, इसे zdt.until(other) की तरह इस्तेमाल किया जा सकता है

निष्कर्ष

  • Temporal API, JavaScript में समय को handle करने के तरीके को क्रांतिकारी रूप से बदल देता है
  • इस लेख में मानव-पठनीय तारीख और UTC तारीख के बीच का अंतर, और Temporal.ZonedDateTime object का उपयोग करके उसे सही ढंग से व्यक्त करने का तरीका समझाया गया है
  • अगले लेख में Instant, PlainDate, Duration जैसे अन्य रोचक objects को देखा जाएगा

GN⁺ की राय

  • JavaScript डेवलपर्स के लिए लंबे समय से मुश्किल बने हुए date और time handling के मुद्दे Temporal API से हल हो सकते हैं
  • यह time zone और DST समस्याओं को अपने आप handle कर सकता है, इसलिए global applications बनाते समय बहुत उपयोगी है
  • मौजूदा Date object के साथ compatibility और migration से जुड़े मुद्दे अब भी ध्यान देने योग्य हैं
  • Temporal API को साफ़ और intuitive तरीके से डिज़ाइन किया गया है, और यह कई calendar systems को support करता है, इसलिए internationalization के लिहाज़ से भी मज़बूत है
  • उम्मीद है कि यह बदलाव JavaScript डेवलपर्स की productivity को काफ़ी बढ़ाएगा

5 टिप्पणियां

 
kyc1682 2024-08-26

आख़िरकार!

 
hongminhee 2024-08-26
 
huiya 2024-08-26

वाह, बड़े global service डिज़ाइन करते समय dates की वजह से हमेशा सिरदर्द रहता था
इसे एक बार आज़माकर देखना चाहूंगा

 
jjpark78 2024-08-26

सच में, क्या अब आखिरकार moment या dayjs का इस्तेमाल किए बिना काम चल जाएगा?

 
GN⁺ 2024-08-25
Hacker News राय
  • Javascript में तारीख और समय को संभालना बहुत कठिन है

    • Moment लाइब्रेरी तारीख और समय को गड़बड़ा देती है, जिससे कई समस्याएँ पैदा होती हैं
    • Python की Arrow लाइब्रेरी भी वही गलती करती है
    • Rust की Chrono लाइब्रेरी अधिक पूर्वानुमेय है और उसमें कम खामियाँ हैं
    • JS का Date और Moment इस्तेमाल करना कठिन है
  • उम्मीद है कि नया API, JS की time zone समस्याओं को हल करेगा

    • एक समस्या यह है कि यह कुछ खास time zone को सही तरह parse करता है, लेकिन बाकी मामलों में UTC मान लेता है
    • पिछली नौकरी में इस समस्या की वजह से बहुत परेशानी हुई थी
  • timestamp को इंसानों द्वारा पढ़ी जा सकने वाली तारीख में बदलने वाला function injective नहीं होता

    • injectivity और well-definedness की अवधारणाओं को गड़बड़ किया जाता है
    • किसी timestamp t के लिए इंसानों द्वारा पढ़ी जा सकने वाली एकमात्र तारीख x मौजूद नहीं होती
  • समय को संभालने की कठिनाई पर एक मज़ाक

    • शुरुआती लोग सिर्फ UTC timestamp का इस्तेमाल करते हैं
    • मध्यम स्तर के लोग कहते हैं कि time zone को store करके convert करना चाहिए
    • विशेषज्ञ फिर से सिर्फ UTC timestamp का ही इस्तेमाल करते हैं
  • अगर भविष्य की तारीखों वाले और उदाहरण इस्तेमाल किए जाते, तो लेख अधिक प्रभावशाली होता

    • timestamp रिकॉर्ड करते समय सिर्फ UTC और location की ज़रूरत होती है
    • बैंक वाला उदाहरण सिर्फ UX की समस्या है, जानकारी के नुकसान की नहीं
  • समय प्रबंधन को न समझ पाने से चिंतित एक उपयोगकर्ता

    • Python जैसी भाषाओं में समय प्रबंधन की समस्याओं को समझने के लिए किसी अच्छे शुरुआती मार्गदर्शक की सिफारिश माँगता है
  • अच्छा datetime standard होना आधी लड़ाई जीतने जैसा है

    • बाकी आधी लड़ाई यह है कि उसे व्यापक रूप से अपनाया जाए
    • दूसरे systems के साथ compatibility के लिए ISO string या unix timestamp में बदलना सुरक्षित है
  • ISO date string को सटीक जानकारी capture करनी चाहिए

    • यह विचार संदिग्ध है कि JavaScript या दूसरी भाषाओं को built-in structure की ज़रूरत है
    • Temporal और Date सरल समस्याओं को जटिल तरीके से हल करते हैं
  • Postgres में इस समस्या को कैसे संभालना चाहिए, यह सवाल

  • इस बात के पर्याप्त सबूत नहीं हैं कि Temporal वास्तव में अपनाया जाएगा

    • कई उम्मीद जगाने वाले JS proposals की तरह, इस पर भी बहुत लंबे समय से सिर्फ चर्चा ही चल रही है