Pothuajse çdo lloj aplikacioni i shkruar në JavaScript funksionon me kohë ose data në një farë kapaciteti. Në fillim, kjo ishte e kufizuar në API-në e integruar të datës. Ky API përfshin funksionalitetin bazë, por është mjaft i kufizuar në atë që mund të bëjë. Bibliotekat e palëve të treta si Moment.js, dhe API-të e integruara më vonë si API-të Intl dhe API-ja e re Temporal, i shtojnë fleksibilitet shumë më të madh punës me oraret dhe datat. Ngritja dhe rënia e momentit.js Moment.js është një bibliotekë JavaScript me mjete të fuqishme për të punuar me oraret dhe datat. Ai përfshin veçori që mungojnë nga API-ja bazë e datës, siç është manipulimi i zonës kohore, dhe i bën shumë operacione të zakonshme më të thjeshta. Momenti përfshin gjithashtu funksione për formatimin e datave dhe orëve. Ajo u bë një bibliotekë e përdorur gjerësisht në shumë aplikacione të ndryshme. Megjithatë, edhe Momenti kishte pjesën e vet të çështjeve. Është një bibliotekë e madhe dhe mund të shtojë ndjeshëm madhësinë e paketës së një aplikacioni. Për shkak se biblioteka nuk mbështet tundjen e pemëve (një veçori e paketave moderne që mund të heqin pjesët e papërdorura të bibliotekave), e gjithë biblioteka Moment përfshihet edhe nëse përdorni vetëm një ose dy nga funksionet e saj. Një çështje tjetër me Momentin është fakti që objektet që krijon janë të ndryshueshme. Thirrja e funksioneve të caktuara në një objekt Moment ka efekte anësore dhe ndryshon vlerën e atij objekti. Kjo mund të çojë në sjellje ose defekte të papritura. Në vitin 2020, mirëmbajtësit e Moment vendosën ta vendosin bibliotekën në modalitetin e mirëmbajtjes. Asnjë zhvillim i ri i veçorive nuk është duke u bërë, dhe mirëmbajtësit rekomandojnë që të mos përdoret për projekte të reja. Ka biblioteka të tjera të datave JavaScript, të tilla si data-fns, por ka një lojtar të ri në qytet, një API i integruar direkt në JavaScript: Temporal. Është një standard i ri që plotëson vrimat e API-së origjinale të datës si dhe zgjidh disa nga kufizimet që gjenden në Moment dhe biblioteka të tjera. Çfarë është e përkohshme? Temporal është një API e re e orës dhe datës që i shtohet standardit ECMAScript, i cili përcakton JavaScript-in modern. Që nga marsi 20266, ai ka arritur në Fazën 4 të procesit TC39 (komiteti që mbikëqyr propozimet dhe shtesat në gjuhën JavaScript) dhe do të përfshihet në versionin tjetër të specifikimit ECMAScript. Ai tashmë është implementuar në disa shfletues: Chrome 144+ dhe Firefox 139+, me Safari që pritet të vijë së shpejti. Një polifill është gjithashtu i disponueshëm për shfletuesit e pambështetur dhe Node.js. Temporal API krijon objekte që, në përgjithësi, përfaqësojnë momente në kohë. Këto mund të jenë vula me kohë të plotë dhe data në një zonë të caktuar kohore, ose mund të jenë një shembull i përgjithshëm i kohës së "orës së murit" pa asnjë informacion për zonën kohore ose datën. Disa nga karakteristikat kryesore të Temporal përfshijnë:
Kohët me ose pa data. Një objekt i përkohshëm mund të përfaqësojë një kohë specifike në një datë të caktuar, ose një kohë pa ndonjë informacion për datën. Mund të përfaqësohet gjithashtu një datë specifike, pa kohë. Mbështetja e zonës kohore. Objektet e përkohshme janë plotësisht të vetëdijshme për zonën kohore dhe mund të konvertohen nëpër zona të ndryshme kohore. Momenti gjithashtu mbështet zonat kohore, por kërkon bibliotekën shtesë të zonës kohore. Pandryshueshmëria. Pasi të krijohet një objekt i përkohshëm, ai nuk mund të ndryshohet. Konvertimet aritmetike kohore ose të zonës kohore nuk e modifikojnë objektin themelor. Në vend të kësaj, ata gjenerojnë një objekt të ri të përkohshëm. Indeksimi i bazuar në 1. Një burim i zakonshëm i gabimeve me API-në e datës (si dhe me Momentin) është se muajt janë të indeksuar me zero. Kjo do të thotë që janari është muaji 0, dhe jo muaji 1 siç e kuptojmë të gjithë në jetën reale. Temporal e rregullon këtë duke përdorur indeksimin e bazuar në 1 - janari është muaji 1. Është i integruar në shfletues. Meqenëse Temporal është një API në vetë shfletuesin, ai nuk shton asgjë në madhësinë e paketës së aplikacionit tuaj.
Është gjithashtu e rëndësishme të theksohet se API-ja e datës nuk do të zhduket. Ndërsa Temporal e zëvendëson këtë API, ai nuk po hiqet apo zhvlerësohet. Shumë aplikacione do të prisheshin nëse shfletuesit e hiqnin papritur API-në e datës. Sidoqoftë, mbani në mend gjithashtu se Moment tani konsiderohet një projekt i trashëguar në modalitetin e mirëmbajtjes. Në pjesën tjetër të artikullit, ne do të shikojmë disa "receta" për migrimin e kodit të bazuar në Moment në API-në e re Temporal. Le të fillojmë rifaktorimin! Krijimi i objekteve të datës dhe orës Përpara se të mund të manipulojmë datat dhe oraret, duhet të krijojmë objekte që i përfaqësojnë ato. Për të krijuar një objekt Moment që përfaqëson datën dhe kohën aktuale, përdorni funksionin moment. const tani = moment(); console.log(tani); // Moment<2026-02-18T21:26:29-05:00>
Ky objekt tani mund të formatohet ose manipulohet sipas nevojës.
// konvertohet në UTC //paralajmërim: Kjo ndryshon objektin Moment dhe e vendos atë në modalitetin UTC! console.log(tani.utc()); // Moment<2026-02-19T02:26:29Z>
// printoni një varg të formatuar - vini re se po përdor kohën UTC tani console.log(tani.format('MM/DD/YYYY hh:mm:ss a')); // 19/02/2026 02:27:07 paradite
Gjëja kryesore për t'u mbajtur mend për Momentin është se një objekt Moment gjithmonë përfshin informacione për kohën dhe datën. Nëse ju duhet të punoni vetëm me informacionin e kohës, kjo zakonisht është në rregull, por mund të shkaktojë sjellje të papritur në situata si koha e kursimit të ditës ose vitet e brishtë, ku data mund të ndikojë në llogaritjet e kohës. Temporal është më fleksibël. Ju mund të krijoni një objekt që përfaqëson datën dhe kohën aktuale duke krijuar një objekt Temporal.Instant. Kjo përfaqëson një pikë në kohë të përcaktuar nga koha që nga "epoka" (mesnatë UTC më 1 janar 1970). Temporal mund ta referojë këtë moment në kohë me saktësi të nivelit nanosekonda. const now = Temporal.Now.instant();
// shih nanosekonda të papërpunuara që nga epoka console.log (tani.epochNanosekonda); // 1771466342612000000n
// format për UTC console.log(tani.toString()); // 2026-02-19T01: 55: 27.844Z
// format për një zonë të caktuar kohore console.log(tani.toString({ Zona kohore: 'America/New_York' })); // 2026-02-18T20:56:57.905-05:00
Objektet Temporal.Instant gjithashtu mund të krijohen për një kohë dhe datë specifike duke përdorur metodën nga statike.
const myInstant = Temporal.Instant.from('2026-02-18T21:10:00-05:00');
// Formatoni çastin në zonën lokale kohore. Vini re se kjo kontrollon vetëm // formatimi - nuk ndryshon objektin siç bën moment.utc. console.log(myInstant.toString({ TimeZone: 'America/New_York' })); // 2026-02-18T21:10:00-05:00
Ju gjithashtu mund të krijoni lloje të tjera të objekteve të përkohshme, duke përfshirë:
Temporal.PlainDate: Një datë pa informacion orar. Temporal.PlainTime: Një kohë pa informacion për datën. Temporal.ZonedDateTime: Një datë dhe orë në një zonë kohore specifike.
Secila prej tyre ka një metodë from që mund të thirret me një objekt që specifikon datën dhe/ose kohën, ose një varg data për analizë. // Vetëm një datë const sot = Temporal.PlainDate.from({ viti: 2026, muaj: 2, // vini re se ne po përdorim 2 për shkurt dita: 18 }); console.log(sot.toString()); // 2026-02-18
// Vetëm një kohë const lunchTime = Temporal.PlainTime.from({ ora: 12 }); console.log(lunchTime.toString()); // ora 12:00:00
// Një datë dhe orë në zonën kohore Lindore të SHBA const dueAt = Temporal.ZonedDateTime.from({ Zona kohore: 'Amerikë/Nju_York', viti: 2026, muaj: 3, dita: 1, ora: 12, minuta: 0, e dyta: 0 }); console.log(dueAt.toString()); // 2026-03-01T12:00:00-05:00[Amerikë/New_York]
Analiza Ne kemi mbuluar krijimin programatik të informacionit të datës dhe orës. Tani le të shohim analizën. Analiza është një zonë ku Momenti është më fleksibël se API-ja e integruar Temporal. Ju mund të analizoni një varg datash duke ia kaluar funksionit moment. Me një argument të vetëm, Moment pret një varg data ISO, por ju mund të përdorni formate alternative nëse jepni një argument të dytë që specifikon formatin e datës që përdoret.
const isoDate = moment ('2026-02-21T09:00:00'); konst formatuarData = momenti ('2/21/26 9:00:00', 'M/D/YY h:mm:ss');
console.log (isoDate); // Moment<2026-02-21T09:00:00-05:00>
console.log(formattedDate); // Moment<2026-02-21T09:00:00-05:00>
Në versionet më të vjetra, Moment do të bënte supozimin më të mirë për të analizuar çdo varg datash të formatuar në mënyrë arbitrare. Kjo mund të çojë në rezultate të paparashikueshme. Për shembull, 02-03-2026 është 2 shkurt apo 3 mars? Për këtë arsye, versionet më të reja të Moment shfaqin një paralajmërim të spikatur zhvlerësimi nëse thirret pa një varg datash të formatuar ISO (përveç nëse jepet edhe argumenti i dytë me formatin e dëshiruar). Temporal do të analizojë vetëm një varg datash të formatuar posaçërisht. Vargu duhet të jetë në përputhje me formatin ISO 8601 ose shtrirjen e tij, RFC 9557. Nëse një varg datash që nuk përputhet i kalohet metodës nga, Temporal do të hedhë një Gabim Gabim.
// Duke përdorur një varg datash RFC 9557 const myDate = Temporal.Instant.from('2026-02-21T09:00:00-05:00[America/New_York]'); console.log(myDate.toString({ Zona kohore: 'America/New_York' })); // 2026-02-21T09:00:00-05:00
// Përdorimi i një vargu të panjohur të datës const otherDate = Temporal.Instant.from('2/21/26 9:00:00'); // Gabim Gabim: Gabim i përkohshëm: Karakter i pavlefshëm gjatë analizimit të vlerës së vitit.
Kërkesat e sakta të vargut të datës varen nga lloji i objektit të përkohshëm që po krijoni. Në shembullin e mësipërm, Temporal.Instant kërkon një ISO të plotëVargu i datës 8601 ose RFC 9557 që specifikon datën dhe kohën me një zhvendosje të zonës kohore, por gjithashtu mund të krijoni objekte PlainDate ose PlainTime duke përdorur vetëm një nëngrup të formatit të datës. 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
Vini re se këto vargje duhet të jenë ende në përputhje me formatin e pritur, ose do të shfaqet një gabim.
// Përdorimi i vargjeve kohore jo në përputhje. Të gjitha këto do të hedhin një Gabim Gabim. Temporal.PlainTime.from('9:00'); Temporal.PlainTime.from('9:00:00 AM');
Këshillë profesionale: Trajtimi i vargjeve jo-ISOMeqë Temporal i jep përparësi besueshmërisë, nuk do të përpiqet të hamendësojë formatin e një vargu si 02-01-2026. Nëse burimi juaj i të dhënave përdor vargje të tilla, do t'ju duhet të bëni disa manipulime të vargut për të riorganizuar vlerat në një varg ISO si 2026-02-01 përpara se të përpiqeni ta përdorni me Temporal.
Formatimi Pasi të keni një objekt Moment ose Temporal, ndoshta do të dëshironi ta konvertoni atë në një varg të formatuar në një moment. Ky është një rast ku Momenti është pak më i shkurtër. Ju thërrisni metodën e formatit të objektit me një varg shenjash që përshkruajnë formatin e dëshiruar të datës. data konst = moment();
console.log(data.format('MM/DD/VVVV')); // 22.02.2026
console.log(date.format('MMMM Do VYYY, h:mm:ss a')); // 22 shkurt 2026, ora 20:18:30
Nga ana tjetër, Temporal kërkon që ju të jeni pak më të folur. Objektet e përkohshme, të tilla si Instant, kanë një metodë toLocaleString që pranon opsione të ndryshme formatimi të specifikuara si veti të një objekti.
data konst = Temporal.Now.instant();
// pa argumente, ne do të marrim formatin e paracaktuar për vendndodhjen aktuale console.log (data.toLocaleString()); // 2/22/2026, 8:23:36 PM (duke supozuar një vendndodhje të en-SHBA)
// kaloni opsionet e formatimit për të gjeneruar një varg formati të personalizuar console.log(date.toLocaleString('en-SHBA', { muaji: 'i gjatë', dita: 'numerike', viti: 'numerik', ora: '2-shifrore', minutë: '2-shifror' })); // 22 shkurt 2026 në orën 20:23
// kaloni vetëm fushat që dëshironi në vargun e formatit console.log(date.toLocaleString('en-SHBA', { muaji: 'i shkurtër', dita: 'numerike' })); // 22 shkurt
Formatimi i përkohshëm i datës në fakt përdor API-në Intl.DateTimeFormat (i cili është tashmë i disponueshëm në shfletuesit modernë) nën kapuç. Kjo do të thotë që ju mund të krijoni një objekt DateTimeFormat të ripërdorshëm me opsionet tuaja të formatimit të personalizuar, më pas t'i kaloni objektet Temporal në metodën e tij të formatit. Për shkak të kësaj, ai nuk mbështet formatet e personalizuara të datave siç bën Moment. Nëse keni nevojë për diçka si "Q1 2026" ose formatime të tjera të specializuara, mund t'ju duhet një kod i personalizuar i formatimit të datës ose të kërkoni një bibliotekë të palëve të treta. const formatter = new Intl.DateTimeFormat('en-SHBA', { muaji: '2-shifror', dita: '2-shifrore', viti: 'numerik' });
data konst = Temporal.Now.instant(); console.log(formator.format(datë)); // 22.02.2026
Shenjat e formatimit të momentit janë më të thjeshta për t'u shkruar, por ato nuk janë të përshtatshme për vendndodhjen. Formati lidh gjëra të "kodit të fortë" si porosia muaj/ditë. Avantazhi i përdorimit të një objekti konfigurimi, siç bën Temporal, është se ai automatikisht do të përshtatet me çdo vend të caktuar dhe do të përdorë formatin e duhur. data konst = Temporal.Now.instant();
formati konstOpsionet = { muaji: 'numerik', dita: 'numerike', viti: 'numerik' };
console.log(date.toLocaleString('en-US', formatOptions)); // 22.2.2026
console.log(date.toLocaleString('en-GB', formatOptions)); // 22/02/2026
Llogaritjet e datës Në shumë aplikacione, do t'ju duhet të përfundoni duke kryer disa llogaritje në një datë. Ju mund të dëshironi të shtoni ose zbritni njësi të kohës (ditë, orë, sekonda, etj.). Për shembull, nëse keni datën aktuale, mund të dëshironi t'i tregoni përdoruesit datën 1 javë nga tani. Objektet momentale kanë metoda të tilla si mbledhja dhe zbritja që kryejnë këto operacione. Këto funksione marrin një vlerë dhe një njësi, për shembull: add(7, 'ditë'). Një ndryshim shumë i rëndësishëm midis Momentit dhe Temporal, megjithatë, është se gjatë kryerjes së këtyre llogaritjeve të datave, objekti themelor modifikohet dhe vlera e tij origjinale humbet. const tani = moment();
console.log(tani); // Moment<2026-02-24T20:08:36-05:00>
const nextWeek = now.add(7, 'ditë'); console.log (javën tjetër); // Moment<2026-03-03T20:08:36-05:00>
// Gotcha - objekti origjinal u ndryshua console.log(tani); // Moment<2026-03-03T20:08:36-05:00>
Për të shmangur humbjen e datës origjinale, mund të telefononi klon në objektin Moment për të krijuar një kopje. konst tani= moment (); const nextWeek = now.clone().add(7, 'ditë');
console.log(tani); // Moment<2026-02-24T20:12:55-05:00>
console.log (javën tjetër); // Moment<2026-03-03T20:12:55-05:00>
Nga ana tjetër, objektet e përkohshme janë të pandryshueshme. Pasi të keni krijuar një objekt si një Instant, PlainDate, e kështu me radhë, vlera e atij objekti nuk do të ndryshojë kurrë. Objektet e përkohshme kanë gjithashtu metoda të mbledhjes dhe zbritjes. Temporal është pak zgjidhës se cilat njësi kohore mund të shtohen në cilat lloje objektesh. Për shembull, nuk mund të shtoni ditë në një Instant:
const now = Temporal.Now.instant(); const nextWeek = tani.add({ ditë: 7 }); // Gabim Gabim: Gabim i përkohshëm: Njësia më e madhe nuk mund të jetë një njësi datash
Kjo është për shkak se objektet e çastit përfaqësojnë një pikë specifike në kohë në UTC dhe janë agnostike kalendarike. Për shkak se kohëzgjatja e një dite mund të ndryshojë në bazë të rregullave të zonës kohore, si p.sh. Ora ditore, kjo llogaritje nuk ofrohet në një çast. Sidoqoftë, mund ta kryeni këtë operacion në lloje të tjera objektesh, të tilla si PlainDateTime: const tani = Temporal.Now.plainDateTimeISO(); console.log(tani.toLocaleString()); // 24.02.2026, 20:23:59
const nextWeek = tani.add({ ditë: 7 });
// Vini re se origjinali PlainDateTime mbetet i pandryshuar console.log(tani.toLocaleString()); // 24.02.2026, 20:23:59
console.log(java e ardhshme.toLocaleString()); // 3/3/2026, 20:23:59
Ju gjithashtu mund të llogarisni se sa kohë është midis dy objekteve Moment ose Temporal. Me funksionin e ndryshimit të Momentit, ju duhet të siguroni një njësi për granularitet, përndryshe ajo do të kthejë diferencën në milisekonda. data konst1 = momenti ('2026-02-21T09:00:00'); data konst2 = momenti ('2026-02-22T10:30:00');
console.log(data2.ndryshim(data1)); // 91800000
console.log(date2.diff(data1, 'ditë')); // 1
Për ta bërë këtë me një objekt të përkohshëm, mund t'i kaloni një objekt tjetër të përkohshëm metodave të tij deri ose pas. Kjo kthen një objekt Temporal.Duration që përmban informacion në lidhje me diferencën kohore. Objekti Duration ka veti për çdo komponent të diferencës, dhe gjithashtu mund të gjenerojë një varg kohëzgjatjeje ISO 8601 që përfaqëson diferencën kohore.
const data1 = Temporal.PlainDateTime.from('2026-02-21T09:00:00'); const data2 = Temporal.PlainDateTime.from('2026-02-22T10:30:00');
// më e madhe Njësia specifikon njësinë më të madhe të kohës për t'u përfaqësuar // në llogaritjen e kohëzgjatjes const diff = data2.since(data1, {Njësia më e madhe: 'ditë' });
console.log (diff.days); // 1
console.log(diff.hours); // 1
console.log(diff.minuta); // 30
console.log(diff.toString()); // P1DT1H30M // (vargu i kohëzgjatjes ISO 8601: 1 ditë, 1 orë, 30 minuta)
Krahasimi i datave dhe orëve Momenti dhe Temporal të dyja ju lejojnë të krahasoni datat dhe orët për të përcaktuar se cila është para tjetrës, por merrni qasje të ndryshme me API. Moment ofron metoda të tilla si është para, është pas dhe është e njëjtë për të krahasuar dy objekte Moment. data konst1 = momenti ('2026-02-21T09:00:00'); data konst2 = momenti ('2026-02-22T10:30:00');
console.log(data1.isPara(data2)); // e vërtetë
Temporal përdor një metodë krahasimi statike për të kryer një krahasim midis dy objekteve të të njëjtit lloj. Ai kthen -1 nëse data e parë vjen përpara së dytës, 0 nëse janë të barabarta, ose 1 nëse data e parë vjen pas së dytës. Shembulli i mëposhtëm tregon se si të krahasohen dy objekte PlainDate. Të dy argumentet për Temporal.PlainDate.compare duhet të jenë objekte PlainDate.
const data1 = Temporal.PlainDate.from({ viti: 2026, muaji: 2, dita: 24 }); const data2 = Temporal.PlainDate.from({ viti: 2026, muaji: 3, dita: 24 });
// data1 vjen para datës2, pra -1 console.log(Temporal.PlainDate.krahaso(data1, data2));
// Gabim nëse përpiqemi të krahasojmë dy objekte të llojeve të ndryshme console.log(Temporal.PlainDate.compare(data1, Temporal.Now.instant())); // TypeError: Gabim i përkohshëm: Ofrohen fusha të pavlefshme PlainDate.
Në veçanti, kjo e bën të lehtë renditjen kronologjike të një grupi objektesh të përkohshme. // Një grup objektesh Temporal.PlainDate datat konst = [ ... ];
// përdorni Temporal.PlainDate.compare si funksion krahasues datat.sort(Temporal.PlainDate.krahaso);
Konvertimet e zonave kohore Biblioteka kryesore e Momentit nuk mbështet konvertimet e zonës kohore. Nëse ju nevojitet ky funksionalitet, duhet të instaloni gjithashtu paketën moment-zone kohore. Kjo paketë nuk tundet nga pema, dhe për këtë arsye mund të shtojë ndjeshëm madhësinë e paketës tuaj. Pasi të keni instaluar zonën moment-kohore, mund t'i konvertoni objektet Moment në zona të ndryshme kohore me metodën tz. Ashtu si me operacionet e tjera Moment, kjo ndryshon bazënobjekt. // Duke supozuar kohën Lindore të SHBA const tani = moment(); console.log(tani); // Moment<2026-02-28T20:08:20-05:00>
// Konverto në kohën e Paqësorit. // Koha origjinale Lindore humbet. tani.tz('Amerika/Los_Angeles'); console.log(tani); // Moment<2026-02-28T17:08:20-08:00>
Funksionaliteti i zonës kohore është i integruar në API-në Temporal kur përdoret një objekt Temporal.ZonedDateTime. Këto objekte përfshijnë një metodë withTimeZone që kthen një ZonedDateTime të re që përfaqëson të njëjtin moment në kohë, por në zonën kohore të specifikuar. // Përsëri, duke supozuar kohën Lindore të SHBA const tani = Temporal.Now.zonedDateTimeISO(); console.log(tani.toLocaleString()); // 2/28/2026, 8:12:02 PM EST
// Konverto në kohën e Paqësorit const nowPacific = now.withTimeZone('America/Los_Angeles'); console.log(nowPacific.toLocaleString()); // 2/28/2026, 5:12:02 PM PST
// Objekti origjinal mbetet i pandryshuar console.log(tani.toLocaleString()); // 2/28/2026, 8:12:02 PM EST
Shënim: Vlerat e formatuara të kthyera nga toLocaleString, siç nënkupton edhe emri, varen nga vendndodhja. Kodi i mostrës u zhvillua në lokalizimin en-US, kështu që formati është si ky: 2/28/2026, 5:12:02 PM PST. Në një vend tjetër, kjo mund të jetë ndryshe. Për shembull, në lokalin en-GB, do të merrni diçka si 28/2/2026, 17:12:02 GMT-8. Një rifaktorim i botës reale Supozoni se po ndërtojmë një aplikacion për planifikimin e ngjarjeve nëpër zona kohore. Pjesë e këtij aplikacioni është një funksion, getEventTimes, i cili merr një varg ISO 8601 që përfaqëson kohën dhe datën e ngjarjes, një zonë kohore lokale dhe një zonë kohore të synuar. Funksioni krijon vargjet e formatuara të orës dhe datës për ngjarjen në të dy zonat kohore. Nëse funksionit i jepet një varg hyrje që nuk është një varg i vlefshëm ora/date, ai do të shkaktojë një gabim. Këtu është zbatimi origjinal, duke përdorur Moment (që kërkon gjithashtu përdorimin e paketës moment-zona kohore).
momenti i importit nga 'moment-zona kohore';
funksioni getEventTimes (inputString, userTimeZone, targetTimeZone) { const timeFormat = 'MMM D, YYYY, h:mm:ss a z';
// 1. Krijo momentin fillestar në zonën kohore të përdoruesit konst ngjarjeKoha = moment.tz( inputstring, moment.ISO_8601, // Prisni një varg ISO 8601 e vërtetë, // Parsing i rreptë përdoruesiTimeZone );
// Hidhni një gabim nëse inputString nuk përfaqësonte një datë të vlefshme if (!eventTime.isValid()) { hedh një gabim të ri ('Data/kohë e pavlefshme hyrje'); }
// 2. Llogaritni kohën e synuar // KRITIKE: Duhet të klonojmë, ose 'koha e ngjarjes' ndryshon përgjithmonë! const targetTime = eventTime.clone().tz(targetTimeZone);
kthehu { lokale: eventTime.format(timeFormat), target: targetTime.format(timeFormat), }; }
orari i konstit = getEventTimes( '05-03-2026T15:00-05:00', 'Amerika/Nju Jork', 'Evropë/Londër', );
console.log (schedule.local); // 5 mars 2026, ora 3:00:00 pasdite EST
console.log (schedule.target); // 5 mars 2026, 20:00:00 GMT
Në këtë shembull, ne jemi duke përdorur një format të datës së pritshme të ISO 8601, i cili është ndërtuar në mënyrë të dobishme në Moment. Ne po përdorim gjithashtu analizim të rreptë, që do të thotë se Momenti nuk do të përpiqet të hamendësojë me një varg datash që nuk përputhet me formatin. Nëse kalohet një varg datash jo-ISO, do të rezultojë në një objekt të pavlefshëm datë dhe ne hedhim një gabim. Zbatimi i përkohshëm duket i ngjashëm, por ka disa dallime kryesore.
funksioni getEventTimes (inputString, userTimeZone, targetTimeZone) { // 1. Analizoni hyrjen direkt në një Instant, më pas krijoni // një ZonedDateTime në zonën e përdoruesit. const instant = Temporal.Instant.from(inputString); const eventTime = instant.toZonedDateTimeISO(userTimeZone);
// 2. Konvertoni në zonën e synuar // Kjo automatikisht kthen një objekt të RI; 'Event Time' është e sigurt. const targetTime = eventTime.withTimeZone(targetTimeZone);
// 3. Formatoni duke përdorur Intl (të integruar) opsionet konst = { viti: 'numerik', muaji: 'i shkurtër', dita: 'numerike', ora: 'numerike', minutë: '2-shifror', i dyti: '2-shifror', Emri i zonës kohore: 'shkurtër' };
kthehu { lokale: eventTime.toLocaleString(navigator.language, opsionet), objektiv: targetTime.toLocaleString(navigator.language, opsionet) }; }
orari i konstit = getEventTimes( '05-03-2026T15:00-05:00', 'Amerika/Nju Jork', 'Evropë/Londër', );
console.log (schedule.local); // 5 mars 2026, ora 15:00:00 EST
console.log (schedule.target); // 5 mars 2026, 20:00:00 GMT
Me Moment, duhet të specifikojmë në mënyrë eksplicite një varg formati për vargjet e datës që rezultojnë. Pavarësisht vendndodhjes ose vendndodhjes së përdoruesit, oraret e ngjarjeve do të formatohen gjithmonë si 5 Mars 2026, ora 3:00:00pm EST. Gjithashtu, nuk duhet të bëjmë në mënyrë eksplicite një përjashtim. Nëse një varg i pavlefshëm i kalohet Temporal.Instant.from, Temporal do të hedhë përjashtimin për ne. Një gjë për t'u theksuar është se edhe me analizë të rreptë, versioni Moment është akoma më i butë. Temporal kërkon zhvendosjen e zonës kohore në fund të vargut. Duhet të keni parasysh gjithashtu se meqenëse ne përdorim navigator.language, ky kod do të ekzekutohet vetëm në një mjedis shfletuesi, pasi navigatori nuk është përcaktuar në një mjedis Node.js. Zbatimi i përkohshëm përdor vendndodhjen aktuale të shfletuesit (navigator.language), kështu që përdoruesi do të marrë automatikisht orët e ngjarjeve të formatuara në formatin e tyre të orës lokale. Në lokalin en-SHBA, kjo është 5 Mars 2026, ora 3:00:00 pasdite EST. Megjithatë, nëse përdoruesi është në Londër, për shembull, oraret e ngjarjeve do të formatohen si 5 Mars 2026, ora 15:00:00 GMT-5. Përmbledhje
Veprimi Momenti.js kohore Koha aktuale moment () Temporal.Now.zonedDateTimeISO() Analiza ISO moment (rr) Temporal.Instant.from(str) Shtoni kohën .add(7, 'ditë') (ndryshon) .add({ ditë: 7 }) (objekt i ri) Diferenca .diff (të tjera, 'orë') .që (tjetër).orë Zona kohore .tz ('Zona/Emri') .withTimeZone ('Zona/Emri')
Në shikim të parë, ndryshimi mund të jetë paksa i ndryshëm (dhe në rastin e sintaksës së përkohshme, ndonjëherë më të thukët dhe më strikte), por ka disa avantazhe kryesore për përdorimin e Temporal mbi Moment.js:
Të jesh më i qartë do të thotë më pak surpriza dhe gabime të padëshiruara. Momenti mund të duket më i butë, por ai përfshin "supozime", të cilat ndonjëherë mund të rezultojnë në data të pasakta. Nëse i jepni Temporal diçka të pavlefshme, ai hedh një gabim. Nëse kodi funksionon, ju e dini që keni një datë të vlefshme. Momenti mund të shtojë madhësi të konsiderueshme në paketën e aplikacionit, veçanërisht nëse jeni duke përdorur paketën e zonës momentale. Temporal nuk shton asgjë (pasi të dërgohet në shfletuesit tuaj të synuar). Pandryshueshmëria ju jep besimin se nuk do t'i humbni ose mbishkruani kurrë të dhënat kur kryeni konvertime dhe operacione të datave. Paraqitje të ndryshme të kohës (Instant, PlainDateTime, ZonedDateTime) në varësi të kërkesave tuaja, ku Moment është gjithmonë një mbështjellës rreth një vule kohore UTC. Temporal përdor API-të Intl për formatimin e datave, që do të thotë se mund të keni formatim të vetëdijshëm për vendndodhjen pa pasur nevojë të specifikoni në mënyrë eksplicite argumentet.
Shënime mbi Polyfill Siç u përmend më herët, ekziston një polifillim i përkohshëm i disponueshëm, i shpërndarë si një paketë npm e quajtur @js-temporal/polyfill. Nëse dëshironi të përdorni Temporal sot, do t'ju duhet kjo polifill për të mbështetur shfletues si Safari që nuk e kanë dërguar ende API-në. Lajmi i keq me këtë është se do të shtojë madhësinë e paketës suaj. Lajmi i mirë është se ai ende shton dukshëm më pak se momenti ose zona kohore. Këtu është një krahasim i madhësive të paketave siç raportohet nga Bundlephobia.com, një faqe interneti që paraqet informacion mbi madhësitë e paketave npm (kliko mbi emrin e çdo pakete për të parë analizën e Bundlephobia):
Paketa Minuar Minimizuar dhe gzip @js-temporal/polyfill 154.1 kB 44,1 kB moment 294,4 kB 75.4 kB moment-zona kohore 1 MB 114.2 kB
Polyfill gjithashtu ka pasur historikisht disa probleme të performancës rreth përdorimit të kujtesës, dhe në kohën e shkrimit, konsiderohet të jetë në një gjendje alfa. Për shkak të kësaj, ju mund të mos dëshironi ta përdorni atë në prodhim derisa të arrijë një gjendje më të pjekur. Lajmi tjetër i mirë është se shpresojmë se polifilli nuk do të nevojitet shumë më gjatë (nëse nuk keni nevojë të mbështesni shfletuesit më të vjetër, sigurisht). Në kohën e shkrimit, Temporal është dërguar në Chrome, Edge dhe Firefox. Nuk është ende plotësisht gati në Safari, megjithëse duket se është i disponueshëm me një flamur kohëzgjatjeje në Pamjen më të fundit të Teknologjisë.