Næstum hvaða forrit sem er skrifað í JavaScript virkar með tíma eða dagsetningum að einhverju leyti. Í upphafi var þetta takmarkað við innbyggða Date API. Þetta API inniheldur grunnvirkni, en er frekar takmarkað hvað það getur gert. Þriðju aðila bókasöfn eins og Moment.js, og síðar innbyggð API eins og Intl API og nýja Temporal API, bæta miklu meiri sveigjanleika við að vinna með tíma og dagsetningar. The Rise And Fall Of Moment.js Moment.js er JavaScript bókasafn með öflugum tólum til að vinna með tíma og dagsetningar. Það felur í sér eiginleika sem vantar úr grunnforritaskilum dagsetninga, eins og tímabeltisstjórnun, og gerir margar algengar aðgerðir einfaldari. Moment inniheldur einnig aðgerðir til að forsníða dagsetningar og tíma. Það varð mikið notað bókasafn í mörgum mismunandi forritum. Hins vegar átti Moment líka sinn hlut. Það er stórt bókasafn og getur bætt verulega við búntastærð forrits. Vegna þess að bókasafnið styður ekki trjáhristing (eiginleiki nútíma búntara sem geta fjarlægt ónotaða hluta bókasafna), er allt Moment bókasafnið innifalið jafnvel þó þú notir aðeins eina eða tvær af aðgerðum þess. Annað mál með Moment er sú staðreynd að hlutirnir sem það skapar eru breytilegir. Að kalla ákveðnar aðgerðir á Moment hlut hefur aukaverkanir og stökkbreytir gildi þess hlutar. Þetta getur leitt til óvæntar hegðunar eða galla. Árið 2020 ákváðu umsjónarmenn Moment að setja bókasafnið í viðhaldsham. Engin þróun á nýjum eiginleikum er gerð og umsjónarmenn mæla gegn því að nota það í ný verkefni. Það eru önnur JavaScript dagsetningarsöfn, eins og date-fns, en það er nýr leikmaður í bænum, API innbyggt beint í JavaScript: Temporal. Þetta er nýr staðall sem fyllir upp í götin á upprunalegu Date API auk þess sem leysir nokkrar takmarkanir sem finnast í Moment og öðrum bókasöfnum. Hvað er tímabundið? Temporal er nýtt tíma- og dagsetningarforritaskil sem er bætt við ECMAScript staðalinn, sem skilgreinir nútíma JavaScript. Frá og með mars 20266 hefur það náð stigi 4 í TC39 ferlinu (nefndin sem hefur umsjón með tillögum og viðbótum við JavaScript tungumálið), og verður innifalið í næstu útgáfu af ECMAScript forskriftinni. Það hefur þegar verið innleitt í nokkrum vöfrum: Chrome 144+ og Firefox 139+, en búist er við að Safari fylgi fljótlega. Fjölfylling er einnig fáanleg fyrir óstudda vafra og Node.js. Temporal API býr til hluti sem venjulega tákna augnablik í tíma. Þetta geta verið fullt tíma- og dagsetningarmerki á tilteknu tímabelti, eða þau geta verið almennt dæmi um „veggklukku“ tíma án nokkurra tímabeltis- eða dagsetningarupplýsinga. Sumir af helstu eiginleikum Temporal eru:
Tímar með eða án dagsetninga. Tímabundinn hlutur getur táknað ákveðinn tíma á tiltekinni dagsetningu, eða tíma án dagsetningarupplýsinga. Ákveðna dagsetningu, án tíma, getur einnig verið táknuð. Stuðningur við tímabelti. Tímabundnir hlutir eru fullkomlega tímabeltismeðvitaðir og hægt er að breyta þeim yfir mismunandi tímabelti. Moment styður líka tímabelti, en það krefst viðbótar augnabliks-tímabeltis bókasafns. Immutability.Þegar tímabundinn hlutur er búinn til er ekki hægt að breyta honum. Tímareikningur eða tímabeltisbreytingar breyta ekki undirliggjandi hlutnum. Þess í stað búa þeir til nýjan Temporal hlut. 1-undirstaða flokkun. Algeng uppspretta villa með Date API (sem og með Moment) er að mánuðir eru núllverðtryggðir. Þetta þýðir að janúar er mánuður 0, frekar en mánuður 1 eins og við öll skiljum í raunveruleikanum. Tímabundin lagar þetta með því að nota 1-undirstaða verðtryggingu - janúar er mánuður 1. Það er innbyggt í vafranum. Þar sem Temporal er API í vafranum sjálfum bætir það engu við búntastærð forritsins þíns.
Það er líka mikilvægt að hafa í huga að Date API hverfur ekki. Þó að Temporal komi í stað þessa API, er ekki verið að fjarlægja það eða úrelt. Mörg forrit myndu bila ef vafrar fjarlægðu skyndilega Date API. Hins vegar, hafðu líka í huga að Moment er nú talið arfleifð verkefni í viðhaldsham. Í restinni af greininni munum við skoða nokkrar „uppskriftir“ til að flytja kóða sem byggir á augnabliki yfir í nýja Temporal API. Byrjum að endurskipuleggja! Að búa til dagsetningar- og tímahluti Áður en við getum stjórnað dagsetningum og tíma verðum við að búa til hluti sem tákna þá. Til að búa til Augnablik hlut sem táknar núverandi dagsetningu og tíma, notaðu augnabliksaðgerðina. const núna = augnablik(); console.log(nú); // Augnablik<2026-02-18T21:26:29-05:00>
Nú er hægt að forsníða þennan hlut eða meðhöndla hann eftir þörfum.
// umbreyta í UTC //viðvörun: Þetta stökkbreytir Moment hlutnum og setur hann í UTC ham! console.log(now.utc()); // Augnablik<2026-02-19T02:26:29Z>
// prentaðu sniðinn streng - athugaðu að hann notar UTC tíma núna console.log(now.format('MM/DD/ÁÁÁÁ kl:mm:ss a')); // 19.02.2026 02:27:07
Það sem þarf að muna um Moment er að Moment hlutur inniheldur alltaf upplýsingar um tíma og dagsetningu. Ef aðeins þarf að vinna með tímaupplýsingar er þetta yfirleitt í lagi, en það getur valdið óvæntri hegðun við aðstæður eins og sumartíma eða hlaupár, þar sem dagsetningin getur haft áhrif á tímaútreikninga. Tímabundið er sveigjanlegra. Þú getur búið til hlut sem táknar núverandi dagsetningu og tíma með því að búa til Temporal.Instant hlut. Þetta táknar tímapunkt sem er skilgreindur af tímanum frá „tímabilinu“ (miðnætti UTC 1. janúar 1970). Temporal getur vísað til þessa augnabliks í tíma með nanósekúndu-stigi nákvæmni. const now = Temporal.Now.instant();
// sjá hráar nanósekúndur frá tímabilinu console.log(now.epochNanoseconds); // 1771466342612000000n
// snið fyrir UTC console.log(now.toString()); // 2026-02-19T01:55:27.844Z
// snið fyrir tiltekið tímabelti console.log(now.toString({ timeZone: 'America/New_York'})); // 2026-02-18T20:56:57.905-05:00
Temporal.Instant hluti er einnig hægt að búa til fyrir ákveðinn tíma og dagsetningu með því að nota frá static aðferð.
const myInstant = Temporal.Instant.from('2026-02-18T21:10:00-05:00');
// Forsníða augnablikið í staðbundnu tímabelti. Athugið að þetta stjórnar aðeins // sniðið - það stökkbreytir ekki hlutnum eins og moment.utc gerir. console.log(myInstant.toString({ timeZone: 'America/New_York'})); // 2026-02-18T21:10:00-05:00
Þú getur líka búið til aðrar tegundir af tímabundnum hlutum, þar á meðal:
Temporal.PlainDate: Dagsetning án tímaupplýsinga. Temporal.PlainTime: Tími án dagsetningarupplýsinga. Temporal.ZonedDateTime: Dagsetning og tími á ákveðnu tímabelti.
Hver þessara hefur frá aðferð sem hægt er að kalla með hlut sem tilgreinir dagsetningu og/eða tíma, eða dagsetningarstreng til að flokka. // Bara stefnumót const today = Temporal.PlainDate.from({ ár: 2026, mánuður: 2, // athugið að við erum að nota 2 fyrir febrúar dagur: 18 }); console.log(today.toString()); // 2026-02-18
// Bara smá stund const lunchTime = Temporal.PlainTime.from({ klukkustund: 12 }); console.log(lunchTime.toString()); // 12:00:00
// Dagsetning og tími á austurhluta bandaríska tímabeltisins const dueAt = Temporal.ZonedDateTime.from({ tímabelti: 'Ameríka/New_York', ár: 2026, mánuður: 3, dagur: 1, klukkustund: 12, mínúta: 0, annað: 0 }); console.log(dueAt.toString()); // 2026-03-01T12:00:00-05:00[Ameríka/New_York]
Dálka Við höfum fjallað um áætlunarlega gerð upplýsinga um dagsetningu og tíma. Nú skulum við líta á þáttun. Aðgreining er eitt svæði þar sem Moment er sveigjanlegra en innbyggt Temporal API. Þú getur flokkað dagsetningarstreng með því að senda hann í augnabliksaðgerðina. Með einni röksemdafærslu býst Moment við ISO dagsetningarstreng, en þú getur notað önnur snið ef þú gefur upp önnur rök sem tilgreinir dagsetningarsniðið sem notað er.
const isoDate = augnablik('2026-02-21T09:00:00'); const formattedDate = moment('2/21/26 9:00:00', 'M/D/YY h:mm:ss');
console.log(isoDate); // Augnablik<2026-02-21T09:00:00-05:00>
console.log(formattedDate); // Augnablik<2026-02-21T09:00:00-05:00>
Í eldri útgáfum myndi Moment gera besta giska á að flokka hvaða dagsetningarstreng sem er að geðþóttasniði. Þetta gæti leitt til ófyrirsjáanlegra niðurstaðna. Er til dæmis 02-03-2026 2. febrúar eða 3. mars? Af þessum sökum sýna nýrri útgáfur af Moment áberandi afskriftarviðvörun ef það er kallað án ISO-sniðinnar dagsetningarstrengs (nema önnur rökin með æskilegu sniði séu einnig gefin upp). Temporal mun aðeins flokka sérstaklega sniðinn dagsetningarstreng. Strenginn verður að vera í samræmi við ISO 8601 sniðið eða framlengingu þess, RFC 9557. Ef dagsetningarstrengur sem ekki er samhæfður er færður í frá aðferð mun Temporal kasta RangeError.
// Notkun RFC 9557 dagsetningarstrengs const myDate = Temporal.Instant.from('2026-02-21T09:00:00-05:00[America/New_York]'); console.log(myDate.toString({ timeZone: 'America/New_York'})); // 2026-02-21T09:00:00-05:00
// Notkun óþekkts dagsetningarstrengs const otherDate = Temporal.Instant.from('2/21/26 9:00:00'); // RangeError: Tímabundin villa: Ógildur stafur við þáttun ársgildis.
Nákvæmar kröfur dagsetningarstrengsins fer eftir hvers konar tímabundnum hlut þú ert að búa til. Í dæminu hér að ofan, Temporal.Instant krefst fulls ISO8601 eða RFC 9557 dagsetningarstrengur sem tilgreinir dagsetningu og tíma með tímabeltisjöfnun, en þú getur líka búið til PlainDate eða PlainTime hluti með því að nota aðeins undirmengi dagsetningarsniðsins. const myDate = Temporal.PlainDate.from('2026-02-21'); console.log(myDate.toString()); // 2026-02-21
const myTime = Temporal.PlainTime.from('09:00:00'); console.log(myTime.toString()); // 09:00:00
Athugaðu að þessir strengir verða samt að vera í samræmi við væntanlegt snið, annars verður villa hent.
// Að nota tímastrengi sem ekki samræmast. Þetta mun allt kasta RangeError. Temporal.PlainTime.from('9:00'); Temporal.PlainTime.from('9:00:00 AM');
Ábending fyrir atvinnumenn: Meðhöndlun strengja sem ekki eru ISO Vegna þess að Temporal setur áreiðanleika í forgang, mun það ekki reyna að giska á snið strengs eins og 02-01-2026. Ef gagnagjafinn þinn notar slíka strengi þarftu að gera strengjameðferð til að endurraða gildunum í ISO streng eins og 2026-02-01 áður en þú reynir að nota hann með Temporal.
Forsníða Þegar þú ert með Augnablik eða Temporal hlut, muntu líklega vilja breyta því í sniðinn streng einhvern tíma. Þetta er tilvik þar sem Moment er aðeins krúttlegra. Þú kallar sniðsaðferð hlutarins með streng af táknum sem lýsa því dagsetningarsniði sem óskað er eftir. const dagsetning = augnablik();
console.log(date.format('MM/DD/ÁÁÁÁ')); // 22.02.2026
console.log(date.format('MMMM Gerðu YYYY, h:mm:ss a')); // 22. febrúar 2026, 20:18:30
Aftur á móti krefst Temporal þess að þú sért aðeins orðlausari. Tímabundnir hlutir, eins og Instant, hafa toLocaleString aðferð sem samþykkir ýmsa sniðvalkosti sem tilgreindir eru sem eiginleikar hlutar.
const date = Temporal.Now.instant();
// með engum rökum fáum við sjálfgefið snið fyrir núverandi svæði console.log(date.toLocaleString()); // 22/2/2026, 20:23:36 (miðað við en-US)
// framhjá sniðmöguleikum til að búa til sérsniðna sniðstreng console.log(date.toLocaleString('en-US', { mánuður: 'langur', dagur: 'tala', ár: 'tala', klukkustund: '2 stafa', mínúta: '2 stafa' })); // 22. febrúar 2026 kl. 20:23
// sendu aðeins reitina sem þú vilt í sniðstrengnum console.log(date.toLocaleString('en-US', { mánuður: 'stutt', dagur: 'tala' })); // 22. feb
Tímabundið dagsetningarsnið notar í raun Intl.DateTimeFormat API (sem er nú þegar aðgengilegt í nútíma vöfrum) undir hettunni. Það þýðir að þú getur búið til endurnýtanlegan DateTimeFormat hlut með sérsniðnum sniðvalkostum þínum og síðan framselt Temporal hluti í sniðaðferðina. Vegna þessa styður það ekki sérsniðin dagsetningarsnið eins og Moment gerir. Ef þú þarft eitthvað eins og 'Q1 2026' eða annað sérhæft snið gætirðu þurft einhvern sérsniðinn dagsetningarkóða eða náð í þriðja aðila bókasafn. const formatter = new Intl.DateTimeFormat('en-US', { mánuður: '2 stafa', dagur: '2 stafa', ár: 'tala' });
const date = Temporal.Now.instant(); console.log(formatter.format(dagsetning)); // 22.02.2026
Auðveldara er að skrifa sniðtákn Moments, en þau eru ekki staðbundin. Snið strengir „harðan kóða“ hluti eins og mánaðar/dagsröð. Kosturinn við að nota stillingarhlut, eins og Temporal gerir, er að hann mun sjálfkrafa laga sig að hvaða stað sem er og nota rétt snið. const date = Temporal.Now.instant();
const formatOptions = { mánuður: 'tala', dagur: 'tala', ár: 'tala' };
console.log(date.toLocaleString('en-US', formatOptions)); // 22/2/2026
console.log(date.toLocaleString('en-GB', formatOptions)); // 22/02/2026
Dagsetningarútreikningar Í mörgum forritum þarftu að gera nokkra útreikninga á dagsetningu. Þú gætir viljað bæta við eða draga frá tímaeiningum (dögum, klukkustundum, sekúndum osfrv.). Til dæmis, ef þú ert með núverandi dagsetningu, gætirðu viljað sýna notanda dagsetninguna eftir 1 viku. Augnablikshlutir hafa aðferðir eins og að leggja saman og draga frá sem framkvæma þessar aðgerðir. Þessar aðgerðir taka gildi og einingu, til dæmis: add(7, 'days'). Einn mjög mikilvægur munur á Moment og Temporal er hins vegar að þegar þessir dagsetningarútreikningar eru framkvæmdir er undirliggjandi hlutnum breytt og upprunalegt gildi hans glatast. const núna = augnablik();
console.log(nú); // Augnablik<2026-02-24T20:08:36-05:00>
const nextWeek = now.add(7, 'dagar'); console.log(næsta viku); // Augnablik<2026-03-03T20:08:36-05:00>
// Gotcha - upprunalega hluturinn var stökkbreyttur console.log(nú); // Augnablik<2026-03-03T20:08:36-05:00>
Til að forðast að tapa upprunalegu dagsetningunni geturðu hringt í klón á Moment hlutnum til að búa til afrit. const núna= augnablik(); const nextWeek = now.clone().add(7, 'dagar');
console.log(nú); // Augnablik<2026-02-24T20:12:55-05:00>
console.log(næsta viku); // Augnablik<2026-03-03T20:12:55-05:00>
Aftur á móti eru tímabundnir hlutir óbreytanlegir. Þegar þú hefur búið til hlut eins og Instant, PlainDate, og svo framvegis, mun gildi þess hlutar aldrei breytast. Tímabundnir hlutir hafa einnig samlagningar- og frádráttaraðferðir. Tímabundið er svolítið vandræðalegt um hvaða tímaeiningum er hægt að bæta við hvaða hlutategundir. Til dæmis geturðu ekki bætt dögum við augnablik:
const now = Temporal.Now.instant(); const nextWeek = now.add({ dagar: 7 }); // RangeError: Tímabundin villa: Stærsta eining getur ekki verið dagsetningareining
Þetta er vegna þess að Instant hlutir tákna ákveðinn tíma í UTC og eru dagatala-agnostic. Vegna þess að lengd dags getur breyst miðað við tímabeltisreglur eins og sumartíma er þessi útreikningur ekki tiltækur á augnabliki. Þú getur hins vegar framkvæmt þessa aðgerð á öðrum tegundum hluta, eins og PlainDateTime: const now = Temporal.Now.plainDateTimeISO(); console.log(now.toLocaleString()); // 24.02.2026, 20:23:59
const nextWeek = now.add({ dagar: 7 });
// Athugaðu að upprunalega PlainDateTime helst óbreytt console.log(now.toLocaleString()); // 24.02.2026, 20:23:59
console.log(nextWeek.toLocaleString()); // 3/3/2026, 20:23:59
Þú getur líka reiknað út hversu mikill tími er á milli tveggja augnabliks eða tímalegra hluta. Með diff-aðgerð Moment þarftu að gefa upp einingu fyrir granularity, annars mun hún skila mismuninum í millisekúndum. const date1 = augnablik('2026-02-21T09:00:00'); const date2 = augnablik('2026-02-22T10:30:00');
console.log(date2.diff(date1)); // 91800000
console.log(date2.diff(date1, 'days')); // 1
Til að gera þetta með Temporal hlut geturðu sent annan Temporal hlut í fyrr eða síðar aðferðir hans. Þetta skilar Temporal.Duration hlut sem inniheldur upplýsingar um tímamismuninn. Duration hluturinn hefur eiginleika fyrir hvern hluta mismunarins og getur einnig búið til ISO 8601 lengdarstreng sem táknar tímamismuninn.
const date1 = Temporal.PlainDateTime.from('2026-02-21T09:00:00'); const date2 = Temporal.PlainDateTime.from('2026-02-22T10:30:00');
// LargestUnit tilgreinir stærstu tímaeiningu sem á að tákna // í tímalengdarútreikningnum const diff = date2.since(date1, {stærstaEining: 'dagur'});
console.log(diff.days); // 1
console.log(diff.hours); // 1
console.log(diff.mínútur); // 30
console.log(diff.toString()); // P1DT1H30M // (ISO 8601 lengdarstrengur: 1 dagur, 1 klukkustund, 30 mínútur)
Að bera saman dagsetningar og tíma Moment og Temporal gera þér bæði kleift að bera saman dagsetningar og tíma til að ákvarða hver kemur á undan hinum, en taktu mismunandi aðferðir með API. Moment býður upp á aðferðir eins og isBefore, isAfter og isSame til að bera saman tvo Moment hluti. const date1 = augnablik('2026-02-21T09:00:00'); const date2 = augnablik('2026-02-22T10:30:00');
console.log(date1.isBefore(date2)); // satt
Temporal notar kyrrstæða samanburðaraðferð til að framkvæma samanburð á tveimur hlutum af sömu gerð. Það skilar -1 ef fyrsta dagsetning kemur á undan annarri, 0 ef þau eru jöfn eða 1 ef fyrri dagsetning kemur á eftir annarri. Eftirfarandi dæmi sýnir hvernig á að bera saman tvo PlainDate hluti. Bæði rökin fyrir Temporal.PlainDate.compare verða að vera PlainDate hlutir.
const date1 = Temporal.PlainDate.from({ ár: 2026, mánuður: 2, dagur: 24 }); const date2 = Temporal.PlainDate.from({ár: 2026, mánuður: 3, dagur: 24 });
// dagsetning1 kemur á undan dagsetningu2, svo -1 console.log(Temporal.PlainDate.compare(date1, date2));
// Villa ef við reynum að bera saman tvo hluti af mismunandi gerðum console.log(Temporal.PlainDate.compare(date1, Temporal.Now.instant())); // TypeError: Tímabundin villa: Ógildir PlainDate reitir gefnir upp.
Einkum gerir þetta það auðvelt að raða fjölda tímabundinna hluta í tímaröð. // Fjöldi af Temporal.PlainDate hlutum const dagsetningar = [...];
// notaðu Temporal.PlainDate.compare sem samanburðaraðgerðina dates.sort(Temporal.PlainDate.compare);
Tímabeltisbreytingar Kjarna augnablikssafnið styður ekki tímabeltisbreytingar. Ef þú þarft þessa virkni þarftu líka að setja upp augnablikstímabeltispakkann. Þessi pakki er ekki hægt að hrista tré og getur því bætt verulega við búntastærðina þína. Þegar þú hefur sett upp augnablik-tímabelti geturðu breytt Moment hlutum í mismunandi tímabelti með tz aðferðinni. Eins og með aðrar Moment-aðgerðir stökkbreytir þetta undirliggjandimótmæla. // Miðað við bandarískan austurtíma const núna = augnablik(); console.log(nú); // Augnablik<2026-02-28T20:08:20-05:00>
// Umbreyttu í Kyrrahafstíma. // Upprunalegur austurtími er glataður. now.tz('Ameríka/Los_Angeles'); console.log(nú); // Augnablik<2026-02-28T17:08:20-08:00>
Tímabeltisvirkni er innbyggð í Temporal API þegar Temporal.ZonedDateTime hlutur er notaður. Þessir hlutir innihalda withTimeZone aðferð sem skilar nýjum ZonedDateTime sem táknar sama augnablik í tíma, en á tilgreindu tímabelti. // Aftur, miðað við austurtíma Bandaríkjanna const now = Temporal.Now.zonedDateTimeISO(); console.log(now.toLocaleString()); // 28/02/2026, 20:12:02 EST
// Umbreyttu í Kyrrahafstíma const nowPacific = now.withTimeZone('Ameríka/Los_Angeles'); console.log(núPacific.toLocaleString()); // 28/02/2026, 17:12:02 PST
// Upprunalegur hlutur helst óbreyttur console.log(now.toLocaleString()); // 28/02/2026, 20:12:02 EST
Athugið: Sniðu gildin sem toLocaleString skilar eru, eins og nafnið gefur til kynna, staðbundin háð. Dæmiskóðinn var þróaður á en-US svæði, þannig að sniðið er svona: 28/2/2026, 17:12:02 PST. Á öðrum stað gæti þetta verið öðruvísi. Til dæmis, í en-GB svæði, myndirðu fá eitthvað eins og 28/2/2026, 17:12:02 GMT-8. Raunveruleg endurnýjun Segjum sem svo að við séum að smíða app til að skipuleggja viðburði yfir tímabelti. Hluti af þessu forriti er aðgerð, getEventTimes, sem tekur ISO 8601 streng sem táknar tíma og dagsetningu viðburðarins, staðbundið tímabelti og marktímabelti. Aðgerðin býr til sniðna tíma- og dagsetningarstrengi fyrir viðburðinn á báðum tímabeltum. Ef aðgerðinni er gefinn inntaksstrengur sem er ekki gildur tíma-/dagsetningarstrengur mun hún kasta villu. Hér er upprunalega útfærslan, með því að nota Moment (þarf líka að nota augnablik-tímabeltispakkann).
flytja augnablik frá 'stund-tímabelti';
fall getEventTimes(inputString, userTimeZone, targetTimeZone) { const timeFormat = 'MMM D, YYYY, h:mm:ss a z';
// 1. Búðu til upphafsstund í tímabelti notandans const atburðurTime = moment.tz( inputString, moment.ISO_8601, // Búast má við ISO 8601 streng satt, // Strangt flokkun userTimeZone );
// Sendu villu ef inputString táknaði ekki gilda dagsetningu if (!eventTime.isValid()) { throw new Error('Ógilt inntak dagsetningar/tíma'); }
// 2. Reiknaðu marktímann // CRITICAL: Við verðum að klóna, annars breytist 'eventTime' að eilífu! const targetTime = eventTime.clone().tz(targetTimeZone);
skila { staðbundið: eventTime.format(timeFormat), target: targetTime.format(timeFormat), }; }
const áætlun = getEventTimes( '2026-03-05T15:00-05:00', 'Ameríka/New_York', 'Evrópa/London', );
console.log(tímaáætlun.staðbundið); // 5. mars 2026, 15:00:00 EST
console.log(áætlun.target); // 5. mars 2026, 20:00:00 GMT
Í þessu dæmi notum við væntanlegt dagsetningarsnið ISO 8601, sem er gagnlegt innbyggt í Moment. Við notum líka stranga þáttun, sem þýðir að Moment mun ekki reyna að giska með dagsetningarstreng sem passar ekki við sniðið. Ef dagsetningarstrengur sem ekki er ISO er samþykktur mun það leiða til ógilds dagsetningarhluts og við hendum villu. Tímabundin útfærsla lítur svipað út en hefur nokkra lykilmun.
fall getEventTimes(inputString, userTimeZone, targetTimeZone) { // 1. Þættu inntakinu beint í augnablik, búðu til // ZonedDateTime á svæði notandans. const augnablik = Temporal.Instant.from(inputString); const eventTime = instant.toZonedDateTimeISO(userTimeZone);
// 2. Umbreyta í marksvæðið // Þetta skilar sjálfkrafa NÝJUM hlut; 'eventTime' er öruggt. const targetTime = eventTime.withTimeZone(targetTimeZone);
// 3. Forsníða með Intl (innbyggt) const valkostir = { ár: 'tala', mánuður: 'stutt', dagur: 'tala', klukkustund: 'tala', mínúta: '2 stafa', second: '2-stafa', timeZoneName: 'stutt' };
skila { staðbundið: eventTime.toLocaleString(navigator.language, valkostir), target: targetTime.toLocaleString(navigator.language, valkostir) }; }
const áætlun = getEventTimes( '2026-03-05T15:00-05:00', 'Ameríka/New_York', 'Evrópa/London', );
console.log(tímaáætlun.staðbundið); // 5. mars 2026, 15:00:00 EST
console.log(áætlun.target); // 5. mars 2026, 20:00:00 GMT
Með Moment verðum við að tilgreina sérstaklega sniðstreng fyrir dagsetningarstrengina sem myndast. Burtséð frá staðsetningu eða staðsetningum notandans verða viðburðatímar alltaf sniðnir sem 5. mars 2026, 3:00:00EST. Einnig þurfum við ekki að kasta sérstaklega fram undantekningu. Ef ógildur strengur er sendur til Temporal.Instant.from mun Temporal henda undantekningunni fyrir okkur. Eitt sem þarf að hafa í huga er að jafnvel með strangri þáttun er Moment útgáfan enn vægari. Tímabundið krefst tímabeltisjöfnunar í lok strengsins. Þú ættir líka að hafa í huga að þar sem við erum að nota navigator.language mun þessi kóði aðeins keyra í vafraumhverfi, þar sem navigator er ekki skilgreindur í Node.js umhverfi. Tímabundin útfærsla notar núverandi staðsetningar vafrans (navigator.language), þannig að notandinn mun sjálfkrafa fá viðburðatíma sniðna á staðartímasniði sínu. Í en-Bandaríkjunum er þetta 5. mars 2026, 15:00:00 EST. Hins vegar, ef notandinn er í London, til dæmis, verða viðburðatímar sniðnir sem 5. mars 2026, 15:00:00 GMT-5. Samantekt
Aðgerð Moment.js Tímabundið Núverandi tími augnablik () Temporal.Now.zonedDateTimeISO() Að greina ISO augnablik (str) Temporal.Instant.from(str) Bættu við tíma .add(7, 'dagar') (breytist) .add({ dagar: 7 }) (nýr hlutur) Mismunur .diff(annað, 'tímar') .síðan(annað).klst Tímabelti .tz('Zone/Name') .withTimeZone('Zone/Name')
Við fyrstu sýn getur munurinn verið örlítið annar (og þegar um Temporal er að ræða, stundum orðrænni og strangari) setningafræði, en það eru nokkrir helstu kostir við að nota Temporal yfir Moment.js:
Að vera skýrari þýðir færri óvart og óviljandi villur. Augnablik kann að virðast vera vægara, en það felur í sér „ágiskanir“ sem geta stundum leitt til rangra dagsetninga. Ef þú gefur Temporal eitthvað ógilt gefur það upp villu. Ef kóðinn keyrir veistu að þú ert með gilda dagsetningu. Augnablik getur bætt umtalsverðri stærð við búnt forritsins, sérstaklega ef þú ert að nota augnablikstímabeltispakkann. Tímabundið bætir engu við (þegar það hefur verið sent í markvafranum þínum). Óbreytanleiki veitir þér það traust að þú munt aldrei missa eða skrifa yfir gögn þegar þú framkvæmir dagsetningarbreytingar og aðgerðir. Mismunandi framsetning tíma (Instant, PlainDateTime, ZonedDateTime) eftir þörfum þínum, þar sem Moment er alltaf umbúðir utan um UTC tímastimpil. Temporal notar Intl API fyrir dagsetningarsnið, sem þýðir að þú getur haft staðsetningarvitað snið án þess að þurfa sérstaklega að tilgreina tákn.
Athugasemdir um Polyfill Eins og fyrr segir er Temporal polyfill í boði, dreift sem npm pakki sem heitir @js-temporal/polyfill. Ef þú vilt nota Temporal í dag þarftu þessa fjölfyllingu til að styðja við vafra eins og Safari sem hafa ekki sent API ennþá. Slæmu fréttirnar við þetta eru þær að það mun bæta við búntastærðina þína. Góðu fréttirnar eru þær að það bætir enn við umtalsvert minna en augnablik eða augnablik-tímabelti. Hér er samanburður á búntastærðum eins og greint er frá af Bundlephobia.com, vefsíðu sem sýnir upplýsingar um npm pakkastærðir (smelltu á hvert pakkaheiti til að sjá Bundlephobia greiningu):
Pakki Minnkað Minnkað og gziplað @js-temporal/polyfill 154,1 kB 44,1 kB augnablik 294,4 kB 75,4 kB augnablik-tímabelti 1 MB 114,2 kB
Fjölfyllingin hefur einnig í gegnum tíðina átt nokkur frammistöðuvandamál í tengslum við minnisnotkun og þegar þetta er skrifað er það talið vera í alfa ástandi. Vegna þessa gætirðu ekki viljað nota það í framleiðslu fyrr en það nær þroskaðri ástandi. Hinar góðu fréttirnar eru þær að vonandi verður ekki þörf á fjölfyllingunni mikið lengur (nema þú þurfir auðvitað að styðja eldri vafra). Þegar þetta er skrifað hefur Temporal sent í Chrome, Edge og Firefox. Það er ekki alveg tilbúið í Safari ennþá, þó það virðist vera fáanlegt með keyrslufána á nýjustu tækniforskoðun.