Скоро свака врста апликације написана у ЈаваСцрипт-у ради са временима или датумима у неком својству. У почетку је ово било ограничено на уграђени АПИ за датум. Овај АПИ укључује основну функционалност, али је прилично ограничен у ономе што може да уради. Библиотеке трећих страна као што је Момент.јс, а касније и уграђени АПИ-ји као што су Интл АПИ-ји и нови Темпорал АПИ, додају много већу флексибилност раду са временима и датумима. Успон и пад тренутка.јс Момент.јс је ЈаваСцрипт библиотека са моћним услужним програмима за рад са временима и датумима. Укључује функције које недостају из основног АПИ-ја за датум, као што је манипулација временском зоном, и чини многе уобичајене операције једноставнијим. Момент такође укључује функције за форматирање датума и времена. Постала је широко коришћена библиотека у многим различитим апликацијама. Међутим, Момент је такође имао свој део проблема. То је велика библиотека и може значајно да допринесе величини пакета апликације. Пошто библиотека не подржава тресење стабла (карактеристику модерних пакета који могу да уклоне неискоришћене делове библиотека), цела библиотека Момент је укључена чак и ако користите само једну или две њене функције. Још један проблем са Моментом је чињеница да су објекти које ствара променљиви. Позивање одређених функција на објекту Момент има нежељене ефекте и мутира вредност тог објекта. Ово може довести до неочекиваног понашања или грешака. 2020. године, одржаваоци Момента одлучили су да ставе библиотеку у режим одржавања. Не ради се на развоју нових функција, а одржаваоци препоручују да се не користе за нове пројекте. Постоје и друге ЈаваСцрипт библиотеке датума, као што је дате-фнс, али постоји нови играч у граду, АПИ уграђен директно у ЈаваСцрипт: Темпорал. То је нови стандард који попуњава рупе у оригиналном Дате АПИ-ју, као и решава нека од ограничења која се налазе у Момент-у и другим библиотекама. Шта је темпорално? Темпорал је нови АПИ за време и датум који се додаје стандарду ЕЦМАСцрипт, који дефинише савремени ЈаваСцрипт. Од марта 20266, достигао је 4. фазу процеса ТЦ39 (комитет који надгледа предлоге и додатке ЈаваСцрипт језику) и биће укључен у следећу верзију спецификације ЕЦМАСцрипт. Већ је имплементиран у неколико претраживача: Цхроме 144+ и Фирефок 139+, а очекује се да ће ускоро уследити Сафари. Полифил је такође доступан за неподржане прегледаче и Ноде.јс. Темпорал АПИ креира објекте који, генерално, представљају тренутке у времену. То могу бити ознаке пуног радног времена и датума у датој временској зони, или могу бити генерички пример времена „зидног сата“ без икаквих информација о временској зони или датуму. Неке од главних карактеристика Темпорал-а укључују:
Времена са или без датума. Темпорални објекат може представљати одређено време на одређени датум или време без икаквих информација о датуму. Одређени датум, без времена, такође може бити представљен. Подршка за временску зону. Темпорални објекти су потпуно свесни временске зоне и могу се конвертовати у различите временске зоне. Момент такође подржава временске зоне, али захтева додатну библиотеку тренутак-временске зоне. Непроменљивост. Једном када је Темпорал објекат креиран, не може се променити. Временска аритметика или конверзије временске зоне не мењају основни објекат. Уместо тога, они генеришу нови темпорални објекат. Индексирање засновано на 1. Уобичајени извор грешака са Дате АПИ-јем (као и са Моментом) је да су месеци нулто индексирани. То значи да је јануар месец 0, а не месец 1 као што сви разумемо у стварном животу. Временски поправља ово коришћењем индексирања заснованог на 1 - јануар је месец 1. Уграђен је у претраживач. Пошто је Темпорал АПИ у самом претраживачу, он ништа не додаје величини пакета ваше апликације.
Такође је важно напоменути да АПИ за датум неће нестати. Иако Темпорал замењује овај АПИ, он се не уклања нити застарева. Многе апликације би се поквариле ако би претраживачи изненада уклонили Дате АПИ. Међутим, такође имајте на уму да се Момент сада сматра застарелим пројектом у режиму одржавања. У остатку чланка, погледаћемо неке „рецепте“ за миграцију кода заснованог на Моменту на нови Темпорал АПИ. Почнимо са преуређивањем! Креирање објеката датума и времена Пре него што можемо да манипулишемо датумима и временима, морамо да креирамо објекте који их представљају. Да бисте креирали објекат Момент који представља тренутни датум и време, користите функцију момента. цонст сада = момент(); цонсоле.лог(сада); // Тренутак<2026-02-18Т21:26:29-05:00>
Овај објекат се сада може форматирати или манипулисати по потреби.
// претворити у УТЦ //упозорење: Ово мутира објекат Момент и ставља га у УТЦ режим! цонсоле.лог(нов.утц()); // Момент<2026-02-19Т02:26:29З>
// штампа форматирани стринг - имајте на уму да сада користи УТЦ време цонсоле.лог(нов.формат('ММ/ДД/ГГГГ чч:мм:сс а')); // 19.02.2026 02:27:07
Кључна ствар коју треба запамтити у вези са Моментом је да објекат Момент увек укључује информације о времену и датуму. Ако треба да радите само са информацијама о времену, то је обично у реду, али може изазвати неочекивано понашање у ситуацијама као што су летње рачунање времена или преступне године, где датум може да утиче на израчунавање времена. Темпорални је флексибилнији. Можете креирати објекат који представља тренутни датум и време креирањем Темпорал.Инстант објекта. Ово представља временску тачку дефинисану временом од „епохе“ (поноћ УТЦ 1. јануара 1970.). Темпорал може референцирати овај тренутак у времену са прецизношћу на нивоу наносекунде. цонст нов = Темпорал.Нов.инстант();
// види сирове наносекунде од епохе цонсоле.лог(нов.епоцхНаносецондс); // 1771466342612000000н
// формат за УТЦ цонсоле.лог(нов.тоСтринг()); // 2026-02-19Т01:55:27.844З
// формат за одређену временску зону цонсоле.лог(нов.тоСтринг({ временска зона: 'Америка/Њу_Јорк' })); // 2026-02-18Т20:56:57.905-05:00
Темпорал.Инстант објекти се такође могу креирати за одређено време и датум коришћењем статичке методе.
цонст миИнстант = Темпорал.Инстант.фром('2026-02-18Т21:10:00-05:00');
// Форматирајте тренутак у локалној временској зони. Имајте на уму да ово само контролише // форматирање - не мутира објекат као момент.утц. цонсоле.лог(миИнстант.тоСтринг({ временска зона: 'Америка/Њу_Јорк' })); // 2026-02-18Т21:10:00-05:00
Такође можете креирати друге типове темпоралних објеката, укључујући:
Темпорал.ПлаинДате: Датум без информација о времену. Темпорал.ПлаинТиме: Време без информација о датуму. Темпорал.ЗонедДатеТиме: Датум и време у одређеној временској зони.
Сваки од њих има фром метод који се може позвати са објектом који наводи датум и/или време, или низом датума за рашчлањивање. // Само састанак цонст тодаи = Темпорал.ПлаинДате.фром({ година: 2026, месец: 2, // имајте на уму да користимо 2 за фебруар дан: 18 }); цонсоле.лог(тодаи.тоСтринг()); // 2026-02-18
// Само време цонст лунцхТиме = Темпорал.ПлаинТиме.фром({ сат: 12 }); цонсоле.лог(лунцхТиме.тоСтринг()); // 12:00:00
// Датум и време у источној временској зони САД цонст дуеАт = Темпорал.ЗонедДатеТиме.фром({ временска зона: 'Америка/Њујорк', година: 2026, месец: 3, дан: 1, сат: 12, минута: 0, друго: 0 }); цонсоле.лог(дуеАт.тоСтринг()); // 2026-03-01Т12:00:00-05:00[Америца/Нев_Иорк]
Парсинг Покрили смо програмско креирање информација о датуму и времену. Сада погледајмо рашчлањивање. Парсинг је једна област у којој је Момент флексибилнији од уграђеног Темпорал АПИ-ја. Можете рашчланити стринг датума тако што ћете га проследити функцији момента. Са једним аргументом, Момент очекује ИСО стринг датума, али можете користити алтернативне формате ако наведете други аргумент који наводи формат датума који се користи.
цонст исоДате = момент('2026-02-21Т09:00:00'); цонст форматтедДате = момент('2/21/26 9:00:00', 'М/Д/ГГ х:мм:сс');
цонсоле.лог(исоДате); // Тренутак<2026-02-21Т09:00:00-05:00>
цонсоле.лог(форматтедДате); // Тренутак<2026-02-21Т09:00:00-05:00>
У старијим верзијама, Момент би најбоље погодио да рашчлани било који произвољно форматирани стринг датума. Ово би могло довести до непредвидивих резултата. На пример, да ли је 02-03-2026 2. фебруар или 3. март? Из тог разлога, новије верзије Момента приказују истакнуто упозорење о застаревању ако је позвано без низа датума у ИСО формату (осим ако није дат и други аргумент са жељеним форматом). Темпорал ће анализирати само посебно форматиран стринг датума. Стринг мора бити усаглашен са ИСО 8601 форматом или његовом екстензијом, РФЦ 9557. Ако се неусаглашени стринг датума прослеђује методи фром, Темпорал ће избацити РангеЕррор.
// Коришћење низа датума РФЦ 9557 цонст миДате = Темпорал.Инстант.фром('2026-02-21Т09:00:00-05:00[Америца/Нев_Иорк]'); цонсоле.лог(миДате.тоСтринг({ временска зона: 'Америка/Њу_Јорк' })); // 2026-02-21Т09:00:00-05:00
// Коришћење непознатог низа датума цонст отхерДате = Темпорал.Инстант.фром('2/21/26 9:00:00'); // РангеЕррор: Временска грешка: Неважећи знак приликом рашчлањивања вредности године.
Тачни захтеви за стринг датума зависе од врсте темпоралног објекта који креирате. У горњем примеру, Темпорал.Инстант захтева пун ИСО8601 или РФЦ 9557 стринг датума који наводи датум и време са помаком временске зоне, али такође можете креирати ПлаинДате или ПлаинТиме објекте користећи само подскуп формата датума. цонст миДате = Темпорал.ПлаинДате.фром('2026-02-21'); цонсоле.лог(миДате.тоСтринг()); // 2026-02-21
цонст миТиме = Темпорал.ПлаинТиме.фром('09:00:00'); цонсоле.лог(миТиме.тоСтринг()); // 09:00:00
Имајте на уму да ови низови и даље морају да буду у складу са очекиваним форматом или ће се појавити грешка.
// Коришћење неусаглашених временских стрингова. Све ово ће бацити РангеЕррор. Темпорал.ПлаинТиме.фром('9:00'); Темпорал.ПлаинТиме.фром('9:00:00 АМ');
Професионални савет: Руковање не-ИСО стринговима Пошто Темпорал даје предност поузданости, неће покушавати да погоди формат стринга као што је 02-01-2026. Ако ваш извор података користи такве стрингове, мораћете да извршите неку манипулацију низовима да бисте преуредили вредности у ИСО стринг као што је 2026-02-01 пре него што покушате да га користите са Темпорал-ом.
Форматирање Једном када имате објекат Момент или Темпорал, вероватно ћете желети да га конвертујете у форматирани стринг у неком тренутку. Ово је случај када је Момент мало сажетији. Позивате метод формата објекта са низом токена који описују жељени формат датума. цонст датум = момент();
цонсоле.лог(дате.формат('ММ/ДД/ГГГГ')); // 22.02.2026
цонсоле.лог(дате.формат('ММММ до ГГГГ, х:мм:сс а')); // 22. фебруар 2026, 20:18:30
С друге стране, Темпорал захтева да будете мало више речи. Темпорални објекти, као што је Инстант, имају метод тоЛоцалеСтринг који прихвата различите опције форматирања наведене као својства објекта.
цонст дате = Темпорал.Нов.инстант();
// без аргумената, добићемо подразумевани формат за тренутни локал цонсоле.лог(дате.тоЛоцалеСтринг()); // 22.02.2026, 20:23:36 (под претпоставком да је локална локација ен-УС)
// прослеђује опције форматирања за генерисање прилагођеног низа формата цонсоле.лог(дате.тоЛоцалеСтринг('ен-УС', { месец: 'дуг', дан: 'нумерички', година: 'нумерички', сат: '2-цифрен', минут: '2-цифрен' })); // 22. фебруар 2026. у 20:23
// само проследите поља која желите у стрингу формата цонсоле.лог(дате.тоЛоцалеСтринг('ен-УС', { месец: 'кратак', дан: 'нумерички' })); // 22. феб
Временско форматирање датума заправо користи Интл.ДатеТимеФормат АПИ (који је већ доступан у модерним претраживачима) испод хаубе. То значи да можете креирати објекат ДатеТимеФормат за вишекратну употребу са својим прилагођеним опцијама обликовања, а затим проследити темпоралне објекте његовом методу форматирања. Због тога не подржава прилагођене формате датума као Момент. Ако вам је потребно нешто попут „К1 2026“ или друго специјализовано форматирање, можда ће вам требати неки прилагођени код за форматирање датума или посегнути за библиотеком треће стране. цонст форматтер = нев Интл.ДатеТимеФормат('ен-УС', { месец: '2-цифрен', дан: '2-цифрен', година: 'нумерички' });
цонст дате = Темпорал.Нов.инстант(); цонсоле.лог(форматтер.формат(дате)); // 22.02.2026
Момент-ови токени за форматирање су једноставнији за писање, али нису прилагођени локалу. Формат стрингова "тврди код" ствари као што је редослед месец/дан. Предност коришћења конфигурационог објекта, као што то чини Темпорал, је у томе што ће се он аутоматски прилагодити било ком датом локалу и користити исправан формат. цонст дате = Темпорал.Нов.инстант();
цонст форматОптионс = { месец: 'нумерички', дан: 'нумерички', година: 'нумерички' };
цонсоле.лог(дате.тоЛоцалеСтринг('ен-УС', форматОптионс)); // 22.2.2026
цонсоле.лог(дате.тоЛоцалеСтринг('ен-ГБ', форматОптионс)); // 22/02/2026
Израчунавање датума У многим апликацијама, на крају ћете морати да извршите неке прорачуне на датум. Можда ћете желети да додате или одузмете јединице времена (дани, сати, секунде, итд.). На пример, ако имате тренутни датум, можда ћете желети да покажете кориснику датум за недељу дана од сада. Објекти момента имају методе као што су сабирање и одузимање које обављају ове операције. Ове функције узимају вредност и јединицу, на пример: адд(7, 'даис'). Једна веома битна разлика између Момента и Темпорал-а, међутим, је у томе што се приликом извођења ових израчунавања датума основни објекат модификује и његова оригинална вредност се губи. цонст сада = момент();
цонсоле.лог(сада); // Тренутак<2026-02-24Т20:08:36-05:00>
цонст нектВеек = нов.адд(7, 'даис'); цонсоле.лог(нектВеек); // Момент<2026-03-03Т20:08:36-05:00>
// Добио сам - оригинални објекат је мутиран цонсоле.лог(сада); // Момент<2026-03-03Т20:08:36-05:00>
Да бисте избегли губитак оригиналног датума, можете позвати цлоне на објекту Момент да бисте направили копију. цонст нов= момент(); цонст нектВеек = нов.цлоне().адд(7, 'даис');
цонсоле.лог(сада); // Момент<2026-02-24Т20:12:55-05:00>
цонсоле.лог(нектВеек); // Момент<2026-03-03Т20:12:55-05:00>
С друге стране, темпорални објекти су непроменљиви. Једном када креирате објекат као што је Инстант, ПлаинДате и тако даље, вредност тог објекта се никада неће променити. Темпорални објекти такође имају методе сабирања и одузимања. Темпорал је мало избирљив око тога које временске јединице се могу додати којим типовима објеката. На пример, не можете да додате дане у Инстант:
цонст нов = Темпорал.Нов.инстант(); цонст нектВеек = нов.адд({ даис: 7 }); // РангеЕррор: Временска грешка: Највећа јединица не може бити јединица датума
То је зато што Инстант објекти представљају одређену тачку у времену у УТЦ-у и агностички су на календар. Пошто се дужина дана може променити на основу правила временске зоне као што је летње рачунање времена, овај прорачун није доступан у Инстанту. Можете, међутим, да извршите ову операцију на другим типовима објеката, као што је ПлаинДатеТиме: цонст нов = Темпорал.Нов.плаинДатеТимеИСО(); цонсоле.лог(нов.тоЛоцалеСтринг()); // 24.02.2026, 20:23:59
цонст нектВеек = нов.адд({ даис: 7 });
// Имајте на уму да оригинални ПлаинДатеТиме остаје непромењен цонсоле.лог(нов.тоЛоцалеСтринг()); // 24.02.2026, 20:23:59
цонсоле.лог(нектВеек.тоЛоцалеСтринг()); // 3/3/2026, 20:23:59 ПМ
Такође можете израчунати колико је времена између два објекта Момент или Темпорал. Са Моментовом дифф функцијом, морате да обезбедите јединицу за грануларност, иначе ће вратити разлику у милисекундама. цонст дате1 = момент('2026-02-21Т09:00:00'); цонст дате2 = момент('2026-02-22Т10:30:00');
цонсоле.лог(дате2.дифф(дате1)); // 91800000
цонсоле.лог(дате2.дифф(дате1, 'даис')); // 1
Да бисте то урадили са Темпорал објектом, можете проследити други Темпорал објекат његовим методама до или Синце. Ово враћа Темпорал.Дуратион објекат који садржи информације о временској разлици. Објекат Дуратион има својства за сваку компоненту разлике, а такође може да генерише низ трајања ИСО 8601 који представља временску разлику.
цонст дате1 = Темпорал.ПлаинДатеТиме.фром('2026-02-21Т09:00:00'); цонст дате2 = Темпорал.ПлаинДатеТиме.фром('2026-02-22Т10:30:00');
// највећа јединица специфицира највећу јединицу времена за представљање // у прорачуну трајања цонст дифф = дате2.синце(датум1, { највећа јединица: 'дан' });
цонсоле.лог(дифф.даис); // 1
цонсоле.лог(дифф.хоурс); // 1
цонсоле.лог(дифф.минутес); // 30
цонсоле.лог(дифф.тоСтринг()); // П1ДТ1Х30М // (стринг трајања ИСО 8601: 1 дан, 1 сат, 30 минута)
Поређење датума и времена Момент и Темпорал вам омогућавају да упоредите датуме и времена да бисте утврдили који долази испред другог, али користите различите приступе са АПИ-јем. Момент обезбеђује методе као што су исБефоре, исАфтер и исСаме за упоређивање два објекта Момент. цонст дате1 = момент('2026-02-21Т09:00:00'); цонст дате2 = момент('2026-02-22Т10:30:00');
цонсоле.лог(дате1.исБефоре(дате2)); // истина
Темпорал користи метод статичког поређења да изврши поређење између два објекта истог типа. Враћа -1 ако први датум долази пре другог, 0 ако су једнаки или 1 ако први датум долази после другог. Следећи пример показује како да упоредите два ПлаинДате објекта. Оба аргумента за Темпорал.ПлаинДате.цомпаре морају бити ПлаинДате објекти.
цонст дате1 = Темпорал.ПлаинДате.фром({ година: 2026, месец: 2, дан: 24 }); цонст дате2 = Темпорал.ПлаинДате.фром({ година: 2026, месец: 3, дан: 24 });
// датум1 долази пре датума2, тако да -1 цонсоле.лог(Темпорал.ПлаинДате.цомпаре(датум1, дате2));
// Грешка ако покушамо да упоредимо два објекта различитих типова цонсоле.лог(Темпорал.ПлаинДате.цомпаре(дате1, Темпорал.Нов.инстант())); // ТипеЕррор: Временска грешка: наведена су неважећа поља ПлаинДате.
Конкретно, ово олакшава сортирање низа темпоралних објеката хронолошки. // Низ објеката Темпорал.ПлаинДате цонст датес = [ ... ];
// користи Темпорал.ПлаинДате.цомпаре као функцију поређења датес.сорт(Темпорал.ПлаинДате.цомпаре);
Конверзије временске зоне Основна библиотека Момент не подржава конверзије временских зона. Ако вам је потребна ова функција, потребно је да инсталирате и пакет за временску зону тренутка. Овај пакет се не може потрести и стога може значајно повећати величину вашег пакета. Када инсталирате тренутну временску зону, можете конвертовати Момент објекте у различите временске зоне помоћу тз методе. Као и код других Момент операција, ово мутира основуобјекат. // Претпостављајући америчко источно време цонст сада = момент(); цонсоле.лог(сада); // Момент<2026-02-28Т20:08:20-05:00>
// Претвори у пацифичко време. // Изворно источно време је изгубљено. нов.тз('Америка/Лос_Ангелес'); цонсоле.лог(сада); // Тренутак<2026-02-28Т17:08:20-08:00>
Функционалност временске зоне је уграђена у Темпорал АПИ када се користи објекат Темпорал.ЗонедДатеТиме. Ови објекти укључују витхТимеЗоне методу која враћа нови ЗонедДатеТиме који представља исти тренутак у времену, али у наведеној временској зони. // Опет, претпостављајући америчко источно време цонст нов = Темпорал.Нов.зонедДатеТимеИСО(); цонсоле.лог(нов.тоЛоцалеСтринг()); // 28.02.2026, 20:12:02 ЕСТ
// Претвори у пацифичко време цонст новПацифиц = нов.витхТимеЗоне('Америца/Лос_Ангелес'); цонсоле.лог(новПацифиц.тоЛоцалеСтринг()); // 28.2.2026, 17:12:02 ПСТ
// Оригинални објекат остаје непромењен цонсоле.лог(нов.тоЛоцалеСтринг()); // 28.02.2026, 20:12:02 ЕСТ
Напомена: Форматиране вредности које враћа тоЛоцалеСтринг су, као што име имплицира, зависне од локализације. Пример кода је развијен у ен-УС локалу, тако да је формат овакав: 28.2.2026, 17:12:02 ПСТ. На другом локалитету, ово може бити другачије. На пример, у ен-ГБ локалу, добићете нешто попут 28/2/2026, 17:12:02 ГМТ-8. Рефакторинг у стварном свету Претпоставимо да правимо апликацију за заказивање догађаја у временским зонама. Део ове апликације је функција гетЕвентТимес, која узима ИСО 8601 стринг који представља време и датум догађаја, локалну временску зону и циљну временску зону. Функција креира форматиране низове времена и датума за догађај у обе временске зоне. Ако је функцији дат улазни низ који није важећи низ времена/датума, испоставиће грешку. Ево оригиналне имплементације, користећи Момент (такође захтева употребу пакета тренутак-временска зона).
увоз тренутка из 'момент-тимезоне';
фунцтион гетЕвентТимес(инпутСтринг, усерТимеЗоне, таргетТимеЗоне) { цонст тимеФормат = 'МММ Д, ГГГГ, х:мм:сс а з';
// 1. Креирајте почетни тренутак у временској зони корисника цонст евентТиме = момент.тз( инпутСтринг, момент.ИСО_8601, // Очекујте ИСО 8601 стринг истина, // Строго рашчлањивање усерТимеЗоне );
// Доноси грешку ако инпутСтринг не представља важећи датум иф (!евентТиме.исВалид()) { тхров нев Еррор('Неисправан унос датума/времена'); }
// 2. Израчунај циљно време // КРИТИЧНО: Морамо клонирати, или се 'евентТиме' заувек мења! цонст таргетТиме = евентТиме.цлоне().тз(таргетТимеЗоне);
врати { локални: евентТиме.формат(тимеФормат), циљ: таргетТиме.формат(тимеФормат), }; }
цонст распоред = гетЕвентТимес( '2026-03-05Т15:00-05:00', 'Америка/Њу_Јорк', 'Европа/Лондон', );
цонсоле.лог(сцхедуле.лоцал); // 5. март 2026, 15:00:00 ЕСТ
цонсоле.лог(сцхедуле.таргет); // 5. март 2026, 20:00:00 ГМТ
У овом примеру користимо очекивани формат датума ИСО 8601, који је корисно уграђен у Момент. Такође користимо стриктно рашчлањивање, што значи да Момент неће покушати да погоди са стрингом датума који не одговара формату. Ако се проследи низ датума који није ИСО, то ће резултирати неважећим објектом датума, а ми ћемо избацити грешку. Темпорал имплементација изгледа слично, али има неколико кључних разлика.
фунцтион гетЕвентТимес(инпутСтринг, усерТимеЗоне, таргетТимеЗоне) { // 1. Парсирајте улаз директно у Инстант, а затим креирајте // ЗонедДатеТиме у зони корисника. цонст инстант = Темпорал.Инстант.фром(инпутСтринг); цонст евентТиме = инстант.тоЗонедДатеТимеИСО(усерТимеЗоне);
// 2. Конвертујте у циљну зону // Ово аутоматски враћа НОВИ објекат; 'евентТиме' је безбедно. цонст таргетТиме = евентТиме.витхТимеЗоне(таргетТимеЗоне);
// 3. Форматирајте користећи Интл (уграђено) цонст оптионс = { година: 'нумерички', месец: 'кратак', дан: 'нумерички', сат: 'нумерички', минут: '2-цифрен', други: '2-цифрен', тимеЗонеНаме: 'кратко' };
врати { локални: евентТиме.тоЛоцалеСтринг(навигатор.лангуаге, оптионс), циљ: таргетТиме.тоЛоцалеСтринг(навигатор.лангуаге, опције) }; }
цонст распоред = гетЕвентТимес( '2026-03-05Т15:00-05:00', 'Америка/Њу_Јорк', 'Европа/Лондон', );
цонсоле.лог(сцхедуле.лоцал); // 5. март 2026, 15:00:00 ЕСТ
цонсоле.лог(сцхедуле.таргет); // 5. март 2026, 20:00:00 ГМТ
Са Моментом, морамо експлицитно да наведемо стринг формата за резултујуће низове датума. Без обзира на локацију или локалитет корисника, време догађаја ће увек бити форматирано као 5. март 2026. у 3:00:00пм ЕСТ. Такође, не морамо експлицитно да избацимо изузетак. Ако се неважећи стринг проследи Темпорал.Инстант.фром, Темпорал ће избацити изузетак уместо нас. Једна ствар коју треба напоменути је да је чак и са стриктним рашчлањивањем, верзија Момента и даље блажа. Темпорал захтева померање временске зоне на крају низа. Такође треба да приметите да пошто користимо навигатор.лангуаге, овај код ће се покретати само у окружењу претраживача, пошто навигатор није дефинисан у окружењу Ноде.јс. Темпорал имплементација користи тренутну локацију претраживача (навигатор.лангуаге), тако да ће корисник аутоматски добити време догађаја форматирано у свом локалном формату времена. У ен-УС локалу, ово је 5. март 2026, 15:00:00 ЕСТ. Међутим, ако је корисник у Лондону, на пример, време догађаја ће бити форматирано као 5. март 2026, 15:00:00 ГМТ-5. Резиме
Акција Момент.јс Темпорал Тренутно време тренутак() Темпорал.Нов.зонедДатеТимеИСО() Парсинг ИСО тренутак(стр) Темпорал.Инстант.фром(стр) Додајте време .адд(7, 'дана') (мутира) .адд({ даис: 7 }) (нови објекат) Разлика .дифф(остало, 'сати') .од(остало).часова Временска зона .тз('Зона/Име') .витхТимеЗоне('Зона/Име')
На први поглед, разлика може бити мало другачија (иу случају Темпорал, понекад опширнија и строжија) синтакса, али постоји неколико кључних предности коришћења Темпорал у односу на Момент.јс:
Бити експлицитнији значи мање изненађења и нежељених грешака. Момент се може чинити блажим, али укључује „нагађање“, што понекад може довести до нетачних датума. Ако Темпорал-у дате нешто неважеће, он ће приказати грешку. Ако се код покрене, знате да имате исправан датум. Момент може додати значајну величину пакету апликације, посебно ако користите пакет за временску зону тренутка. Темпорал не додаје ништа (када се пошаље у ваше циљне прегледаче). Непроменљивост вам даје поверење да никада нећете изгубити или преписати податке када обављате конверзије датума и операције. Различите репрезентације времена (Инстант, ПлаинДатеТиме, ЗонедДатеТиме) у зависности од ваших захтева, где је Момент увек омотач око УТЦ временске ознаке. Темпорал користи Интл АПИ-је за форматирање датума, што значи да можете имати форматирање с обзиром на локализацију без потребе да експлицитно наведете токене.
Нотес он Тхе Полифилл Као што је раније поменуто, доступан је Темпорал полифилл, дистрибуиран као нпм пакет под називом @јс-темпорал/полифилл. Ако желите да користите Темпорал данас, биће вам потребан овај полифил да бисте подржали прегледаче као што је Сафари који још нису испоручили АПИ. Лоша вест са овим је да ће то повећати величину вашег пакета. Добра вест је да и даље додаје знатно мање од момента или временске зоне. Ево поређења величина пакета како их извештава Бундлепхобиа.цом, веб локација која представља информације о величинама нпм пакета (кликните на назив сваког пакета да бисте видели анализу Бундлепхобиа):
Пакет Минифиед Минимизирано и гзиповано @јс-темпорал/полифилл 154.1 кБ 44.1 кБ момент 294.4 кБ 75.4 кБ тренутак-временска зона 1 МБ 114.2 кБ
Полифил је такође историјски имао проблема са перформансама око коришћења меморије, а у време писања сматра се да је у алфа стању. Због тога, можда нећете желети да га користите у производњи док не достигне зрелије стање. Друга добра вест је да се надамо да полифилл више неће бити потребан (осим ако не морате да подржавате старије претраживаче, наравно). У време писања, Темпорал се испоручивао у Цхроме-у, Едге-у и Фирефок-у. Још није сасвим спреман у Сафарију, иако се чини да је доступан са заставицом за време извршавања на најновијем технолошком прегледу.