JavaScript Temporal आ रहा है
(developer.mozilla.org)- JavaScript का नया Temporal ऑब्जेक्ट ब्राउज़र की experimental releases में शामिल होना शुरू हो गया है, और इसका लक्ष्य date, time, duration और calendar handling को built-in API के ज़रिए अधिक सटीक और consistent बनाना है
- मौजूदा
Dateमें user local time और UTC-केंद्रित संरचना, अस्थिर parsing, और mutable behavior के कारण time zone handling और debugging मुश्किल रही है - Temporal,
Temporal.Instant,Temporal.ZonedDateTime,Temporal.PlainDateTime,Temporal.Duration,Temporal.Nowआदि के माध्यम से time point, local time, और duration को अलग करता है और 200 से अधिक utility methods देता है - स्थिर cross-browser support तक पहुँचने में अभी समय लगेगा, लेकिन Firefox Nightly में
javascript.options.experimental.temporalसेटिंग के पीछे Temporal को आज़माया जा सकता है - MDN में इस हफ्ते Temporal पर 270 पेज से अधिक का documentation जोड़ा गया है, और
@js-temporal/polyfillके साथ TC39 docs page पर flags बदले बिना examples चलाए जा सकते हैं
JavaScript Date की पुरानी सीमाएँ
- जब JavaScript 1995 में बनाया गया था, तब
Dateऑब्जेक्ट ने Java के शुरुआतीjava.util.Dateimplementation की नकल की थी। Java ने इसे 1997 में बदल दिया, लेकिन JavaScript ने लगभग 30 साल तक वही API बनाए रखा है - सबसे बड़ी समस्या time zone support की कमी और अस्थिर parsing behavior है
- यह केवल user local time और UTC को support करता है
Dateखुद mutable है, इसलिए यह ऐसे bugs पैदा कर सकता है जिन्हें trace करना कठिन हो- Daylight Saving Time(DST) और historical calendar changes के पार calculations संभालना भी मुश्किल है
- इन सीमाओं की वजह से कई developers application में date और time handling के लिए Moment.js या date-fns जैसी dedicated libraries पर निर्भर रहे हैं
Temporal date और time model को कैसे बदलता है
- Temporal को
Dateऑब्जेक्ट के पूर्ण replacement के रूप में design किया गया है, और इसका लक्ष्य date व time management को अधिक reliable और predictable बनाना है - यह time zone और calendar representation को support करता है, और conversion, comparison, calculation, और formatting के लिए built-in methods देता है
- API surface में 200 से अधिक utility methods हैं, और MDN के Temporal documentation में इनके descriptions और examples जोड़े गए हैं
Temporal के मुख्य types
- Temporal unique time point, local wall-clock time, और duration को अलग-अलग types में विभाजित करता है
- मुख्य संरचनाएँ इस प्रकार हैं
Temporal.Duration: दो time points के बीच का अंतरTemporal.Instant: timestamp के रूप में व्यक्त unique time pointTemporal.ZonedDateTime: time zone सहित date और timeTemporal.PlainDateTime: time zone के बिना पूरा date और timeTemporal.PlainDate: केवल dateTemporal.PlainYearMonth: year और monthTemporal.PlainMonthDay: month और dayTemporal.PlainTime: केवल time
Temporal.Now: current time को अलग-अलग class instances या specific formats में पाने का API
उदाहरणों से उपयोग का तरीका
- मौजूदा date और time को ISO string के रूप में पाया जा सकता है, और कई methods में time zone पास किया जा सकता है
Temporal.Now.plainDateTimeISO()system time zone का current date और time लौटाता हैTemporal.Now.plainDateTimeISO("America/New_York")New York time zone का current date और time लौटाता है
- Gregorian के अलावा दूसरे calendars भी संभाले जा सकते हैं, इसलिए Hebrew, Chinese, Islamic जैसे calendar systems की dates बनाई जा सकती हैं
- Chinese calendar के
M011 दिन का उपयोग करके अगला Chinese New Year calculate किया जा सकता है - लेखन के समय example output में अगला Chinese New Year
1/29/2025है
- Chinese calendar के
- Unix Epoch millisecond timestamp को
Temporal.Instant.fromEpochMilliseconds()से time point में बदला जा सकता है, औरTemporal.Now.instant()से तुलना करके बचा हुआ समय निकाला जा सकता है- example timestamp
1851222399924के लिएsmallestUnit: "hour"के साथ अभी से बचा समय calculate किया जाता है @js-temporal/polyfilloutput31,600 hrदेता है, जबकि Firefox Nightly outputPT31600Hहै
- example timestamp
- Firefox implementation का
toLocaleStringअभी locale-sensitive string output नहीं देता- यह behavior तकनीकी सीमा से अधिक एक design decision के करीब है, और duration formatting खुद संभव है
- polyfill और Firefox implementation बाद में एक-दूसरे के करीब आ सकते हैं
compare()method का उपयोग array sorting में किया जा सकता हैdurations.sort(Temporal.Duration.compare)का उपयोग करने पर क्रमPT1H,PT1H30M,PT1H45M,PT2Hबनता है
ब्राउज़र support और इसे आज़माने का तरीका
- Temporal support experimental browser releases में धीरे-धीरे शामिल होना शुरू हुआ है, और फिलहाल Firefox implementation सबसे mature दिखाई देती है
- Firefox में Nightly version पर
javascript.options.experimental.temporalसेटिंग के पीछे Temporal build किया जा रहा है - implementation tracking के लिए प्रमुख browser issues ये हैं
- Firefox: Build temporal in Nightly by default
- Safari: [JSC] Implement Temporal
- Chrome: Implement the Temporal proposal
- पूरी compatibility status MDN के Temporal object Browser Compatibility section में देखी जा सकती है
- TC39 Temporal documentation में
@js-temporal/polyfillउपलब्ध है, इसलिए किसी भी browser में flags या settings बदले बिना developer tools console में examples चलाए जा सकते हैं
1 टिप्पणियां
Hacker News की राय
Temporal शानदार है। मैं कुछ समय से polyfill के साथ इसे production में इस्तेमाल कर रहा हूं, और यह पुराने
Date()API में आने वाली कई समस्याओं को हल कर देता है।Rust के
chrono, Java के Joda Time जैसी अच्छी time libraries से प्रेरणा लेकर उन्हें इस्तेमाल में आसान API में अच्छी तरह जोड़ दिया गया है—ऐसा लगता है।plain time, instant, और time zone सहित time को अलग-अलग रखने से यह थोड़ा ज्यादा जटिल जरूर है, लेकिन समय खुद जटिल है, इसलिए developers को उस जटिलता का सामना करना ही चाहिए।
“इस timestamp में एक दिन जोड़ना है” जैसी चीज़ों में भी यह तय करना जरूरी है कि यह किस time zone के आधार पर है; वरना daylight saving time, user के time zone बदलने, या server time zone के फर्क की वजह से bugs रह जाते हैं।
fixed offset timestamp (
2025-01-01T00:00+02:00) और किसी खास time zone (Europe/Paris) के serialization के फर्क को भी यह हल कर देता है।chronoसहित दूसरी date-time crates से तुलना भी व्यवस्थित रूप से दी गई है: https://docs.rs/jiff/latest/jiff/_documentation/comparison/i...निजी तौर पर मुझे यह कहना मुश्किल लगता है कि Temporal ने Rust के
chronoसे बहुत ज्यादा प्रेरणा ली है; Joda या आजकल केjava.time, और date-fns या Moment.js जैसी JavaScript date-time libraries का असर ज्यादा दिखता है।वे यह देखने की कोशिश नहीं करते कि
Europe/ParisFrance के बड़े हिस्से को बताता है या सिर्फ Paris को, और उन्हें ऐसा महसूस होता है जैसे वे कह रहे हों कि वे Paris में रहते हैं, जिससे वे चिढ़ जाते हैं।online community events schedule करते समय यह चीज़ काफी परेशान करने वाली रही है। लोग fixed offset इस्तेमाल करना चाहते हैं, और
CET/CESTजैसी expressions उन्हें ठीक लगती हैं, लेकिनEurope/yourexactcoordinatesजैसा कुछ पसंद नहीं आता।असल में ज्यादातर time zones काफी बड़े इलाकों को cover करते हैं, यह मुझे पता है, लेकिन privacy की चिंता करने के बावजूद “time” और “time zone” के फर्क को देखने की इच्छा न रखने वाले लोग बहुत हैं।
chronoऔर Joda Time अलग-अलग दौर की चीज़ें हैं। जब Rust 1.0 आया था, तब Java ने standard library के java.time में यह approach पहले ही implement कर दी थी, और इस काम के लिए third-party library की जरूरत नहीं थी।docs में इसे ढूंढने में काफी समय लगा, लेकिन Temporal.ZonedDateTime.prototype.withTimeZone() एक time zone से दूसरे time zone में convert कर देता है: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...
Temporal.ZonedDateTime.from("2021-08-01T12:00[America/New_York]")से बने value कोwithTimeZone("Europe/Paris")में डालने पर यह2021-08-01T18:00:00+02:00[Europe/Paris]बन जाता है।time zone conversion और duration handling ऐसी core capabilities हैं जिन्हें library को जरूर संभालना चाहिए, और अच्छी बात है कि Temporal दोनों संभालता है। हालांकि
Temporal.Durationमेंduration.format('H\hmm\m')जैसा customformatfunction नहीं दिखता, जिससे1h03mबनाया जा सके।1 yr,3 hours,3mजैसे: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...मैंने icu4x library में इसका कुछ implementation किया था।
अभी TC39 में काफी सारे proposals पर काम पक रहा है, और Temporal उन चीज़ों में से है जिन्हें मैं जल्दी release होते देखना चाहूंगा
मुझे पता है कि major browsers में नए features support करने के लिए v8, JSC और SpiderMonkey engineers की development मेहनत लगती है, इसलिए जो लोग progress करा रहे हैं उनका सच में आभारी हूं
अधीर होने के नाते मन करता है कि कहूं, “Records और Tuples भी जल्दी कर दो! Pipe syntax की लड़ाई skip कर सकते हो!”
मेरी समझ है कि browser vendors इस समय नए primitive types जोड़ने के खिलाफ पहले से ही काफी मजबूत विरोध में हैं। equality कैसे काम करनी चाहिए, इसकी मुश्किलें इस thread में समझाई गई हैं: https://github.com/tc39/proposal-record-tuple/issues/387
मुझे शुरू में उम्मीद नहीं थी कि BigInt इतना ज्यादा इस्तेमाल होगा, लेकिन असल में structural equality वाली collections की जरूरत बार-बार पड़ती रहती है, इसलिए इसकी कमी खलती है
मेरी जानकारी में नए primitive types जोड़ने का विरोध pattern matching को भी प्रभावित कर रहा है, लेकिन वजह मुझे ठीक से नहीं पता और उस proposal को मैं उतना follow नहीं कर रहा हूं
pipelines, pattern matching, Records+Tuples—ये सभी 4 साल से ज्यादा समय से काम में हैं और अभी भी stage 1–2 पर अटके हैं। पिछले एक साल में meaningful progress pattern matching को छोड़कर शायद ही दिखी है
Records और Tuples repository के issues के मुताबिक value semantics, यानी
===काम कर सकता है या नहीं, इस पर pushback था। value semantics निकाल दें तो proposal की usefulness काफी घट जाती हैइन्हें stage 3 तक पहुंचने में कम से कम 1–2 साल और लगेंगे, या शायद कभी न पहुंचें। फिर भी array grouping functions आ गए हैं
अभी यह stage 1 में है, इसलिए दुख की बात है कि इसमें शायद कुछ साल और लगेंगे
AS3 का Dictionary ऐसा type था जिसमें object references, strings और numbers को unique keys के रूप में इस्तेमाल किया जा सकता था और किसी भी type की value जोड़ी जा सकती थी। जब तक dictionary object खुद जीवित रहता था, garbage collection भी इस तरह handle होती थी कि वे weak references न रहें
JavaScript के Set की तरह सोचिए, लेकिन जहां आप किसी भी तरह की specified key को strong type की तरह इस्तेमाल करते और compile time पर error मिलती। उस language की याद आती है
उन updates ने असल में JavaScript ecosystem को बिगाड़ दिया, और अब लगता है कि सिर्फ वे languages बची हैं जो JS में compile होती हैं। जो लोग अभी भी vanilla JS लिखते हैं वे ऐसे लगते हैं जैसे assembly में apps बना रहे हों
मुझे जिज्ञासा है कि Temporal के अंदर हर time zone का data कैसे up-to-date रखा जाता है
क्या structure ऐसा है कि TC39 कहीं data update करता है और हर browser उस data को internal copy करके नया version release करता है, या अगर user ने नए data वाले browser में update नहीं किया है तो मेरी website पर उसे गलत समय दिखेगा?
उदाहरण के लिए Mexico ने 2022 में daylight saving time खत्म कर दिया था: https://en.wikipedia.org/wiki/Time_in_Mexico
pytzयाmoment-timezoneजैसी third-party libraries में server-side library update कर सकते हैं, और standard library handle करे तो language version upgrade कर सकते हैं, लेकिन Temporal और visitor के browser में यह कैसे होगा, समझ नहीं आताuser के computer को भी इस database तक access हो सकता है और शायद updates handle करता हो, लेकिन पक्का नहीं। browser अलग से इस database को download करके maintain भी कर सकता है, और लगता है implementation पर निर्भर करेगा
संबंधित database: https://en.wikipedia.org/wiki/Tz_database
Intlhelpers की वजह से locales भी up-to-date रखने पड़ते हैं, इसलिए उस हिस्से की जांच करने पर शायद मिलता-जुलता जवाब मिल सकता हैtzdbuse करता हैअगर user ने नए time zone data को reflect करने के लिए browser या system update नहीं किया है, तो गलत समय दिख सकता है—यह बात कुल मिलाकर सही लगती है। हालांकि यह मौजूदा सामान्य practice से बहुत अलग नहीं है
विकल्प यह है कि हर application अपना
tzdbसाथ रखे; कुछ apps ऐसा करते हैं और उसके valid कारण भी हो सकते हैं। लेकिन आम तौर पर यह wasteful है, applications के बीच inconsistencies बढ़ाता है, और update cycle भी धीमी होने की संभावना रखता हैजब कोई टाइम ज़ोन बदलता है, तो उसे detect करने वाला event जोड़ना चाहिए
“समय के बारे में programmers के झूठे विश्वास” वाली सूची में “programmers मानते हैं कि इस्तेमाल के दौरान टाइम ज़ोन fixed रहता है” भी जोड़ा जा सकता है। असलियत में हर दिन लाखों लोग टाइम ज़ोन पार करते हैं
हाँ, libraries के लिए मददगार हो सकता है
.Nowका function call न होना बहुत निराशाजनक है। यह property नहीं होनी चाहिएloop के अंदर
.Nowको कई बार evaluate करने पर हर बार अलग value आ सकती है, जो unexpected हैC# ने भी यही choice की थी और नहीं करनी चाहिए थी: https://ericlippert.com/2014/05/19/when-should-i-write-a-pro...
Nowअसली values लाने वाले functions का namespace है, जैसेNow.instant()Temporal proposal सच में पसंद है, लेकिन एक बात खटकती है। comparison में यह reference equality पर निर्भर करता है
यानी
Temporal.Instant.from('2020-01-01') != Temporal.Instant.from('2020-01-01')होगायह अपने-आप में बुरा नहीं है, लेकिन इन objects को
Mapkeys के रूप में इस्तेमाल करने याSetमें जमा करने की ability को लगभग खत्म कर देता है। मैं समझता हूँ कि यह फैसला क्यों लिया गया, लेकिन अफसोस है कि यह possible नहीं हैशायद किसी दिन Records और Tuples सच में आ गए तो उन पर आधारित version मिल जाए
==reference के बजाय equality देता हो?.epochMillisecondsकोMap/Setkey या element के रूप में इस्तेमाल किया जा सकता है। लेकिन अगरMapमें टाइम ज़ोन data preserve करना हो याInstantपर extra operations चाहिए हों, तो value side में originalInstantpreserve करना पड़ेगाSetके मामले मेंMap{v.epochMilliseconds:v}की तरह इस्तेमाल करकेInstantpreserve कर सकते हैंशानदार नहीं है, लेकिन यह Temporal से ज़्यादा JavaScript खुद की गलती है। runtime से handle करवाया जा सकता था, लेकिन तब polyfill fail हो जाएगा
Map/Setमें इस्तेमाल करना floating-point numbers कोMap/Setमें इस्तेमाल करने जैसा है, इसलिए आम तौर पर बुरा idea हैString()या'2020-01-01'इस्तेमाल कर लें?existing API के साथ काम करने वाला comparison function देना मजबूत design है। नया type जोड़ते समय इसे mandatory requirement मान लेने लायक है
उदाहरण के लिए
Temporal.Duration.compareकोsortमें pass करने परPT1H,PT1H30M,PT1H45M,PT2Hके order में sort कर सकते हैं। designers को सलामसमझ आता है कि
Temporalनाम शायद Moment, Datetime जैसे generic time objects से clash बचाने के लिए चुना गया है, लेकिन नाम अच्छा नहीं हैपहली बार देखने पर लगा था कि यह garbage collection control जैसा कुछ होगा
temporalका मतलब eternity के विपरीत समय से जुड़ा हुआ, grammar tense या time distinction से जुड़ा हुआ, या space से अलग time से जुड़ा हुआ होता है: https://www.merriam-webster.com/dictionary/temporalसुनने में ठीक नाम लगता है
सबसे पहले,
Temporalnoun नहीं adjective है। समय से जुड़ा है, लेकिन intuitively फिट नहीं बैठताज़्यादा महत्वपूर्ण बात यह है कि पुराने code से clash की संभावना कम करने के लिए अजीब नाम चुनने पर समय के साथ language और opaque होती जाती है
PromiseऔरGeneratorजोड़ते समय भी उन object names का इस्तेमाल करने वाली कई libraries थीं। reserved words के उलट built-in objects को overwrite किया जा सकता है, इसलिए यह बड़ा issue नहीं थाstandard committee को language की long-term health के लिए दृढ़ता से
Timeइस्तेमाल करना चाहिए थाहालाँकि यह debate अब निकल चुकी है और browser makers व JS engine implementers सहमत हो चुके होंगे
DateV2होताbackward compatibility की जरूरत समझता हूँ, लेकिन
Temporalका feel अच्छा नहीं है।DateTimeतो JS standard में कोई name भी नहीं है, फिर उसे क्यों नहीं इस्तेमाल किया समझ नहीं आता। तब तक मैंconst DateTime = Temporalरखूँगासंबंधित पोस्ट:
JavaScript Temporal Is Coming - https://news.ycombinator.com/item?id=42809834 - जनवरी 2025, 18 comments
Mozilla: Temporal (Limited Availability) - https://news.ycombinator.com/item?id=42776548 - जनवरी 2025, 1 comment
Is It Time for the JavaScript Temporal API? - https://news.ycombinator.com/item?id=29712118 - दिसंबर 2021, 100 comments
Temporal: Getting started with JavaScript's new date time API - https://news.ycombinator.com/item?id=27661667 - जून 2021, 194 comments
JavaScript Temporal - https://news.ycombinator.com/item?id=27395236 - जून 2021, 1 comment
JavaScript Proposal Temporal for Dates is now stage 3 - https://news.ycombinator.com/item?id=26432346 - मार्च 2021, 1 comment
बड़े जहाज़ को दिशा बदलने में देर लगती है—यह बात बिल्कुल सही बैठती है