Майже будь-яка програма, написана на JavaScript, певною мірою працює з часом або датою. На початку це було обмежено вбудованим API дат. Цей API містить базову функціональність, але має досить обмежені можливості. Бібліотеки сторонніх розробників, як-от Moment.js, і пізніше вбудовані API, такі як Intl API і новий Temporal API, додають набагато більшої гнучкості для роботи з часом і датами. Зліт і падіння Moment.js Moment.js — це бібліотека JavaScript із потужними утилітами для роботи з часом і датами. Він включає функції, відсутні в базовому API дати, такі як керування часовим поясом, і спрощує багато звичайних операцій. Moment також містить функції для форматування дат і часу. Вона стала широко використовуваною бібліотекою в багатьох різних програмах. Однак у Moment також були свої проблеми. Це велика бібліотека, яка може значно збільшити розмір набору програми. Оскільки бібліотека не підтримує струшування дерева (функція сучасних пакетників, які можуть видаляти невикористані частини бібліотек), уся бібліотека Moment включена, навіть якщо ви використовуєте лише одну або дві її функції. Ще одна проблема з Moment полягає в тому, що об’єкти, які він створює, є змінними. Виклик певних функцій об’єкта Moment має побічні ефекти та змінює значення цього об’єкта. Це може призвести до неочікуваної поведінки або помилок. У 2020 році супроводжувачі Moment вирішили перевести бібліотеку в режим обслуговування. Ніякої нової функції не розробляється, і супроводжувачі рекомендують не використовувати її для нових проектів. Існують інші бібліотеки дат JavaScript, наприклад date-fns, але в місті є новий гравець, API, вбудований безпосередньо в JavaScript: Temporal. Це новий стандарт, який заповнює прогалини в оригінальному API Date, а також усуває деякі обмеження, наявні в Moment та інших бібліотеках. Що таке скроневе? Temporal — це новий API часу й дати, який додається до стандарту ECMAScript, який визначає сучасний JavaScript. Станом на березень 20266 року він досяг етапу 4 процесу TC39 (комітет, який контролює пропозиції та доповнення до мови JavaScript) і буде включений до наступної версії специфікації ECMAScript. Він уже реалізований у кількох браузерах: Chrome 144+ і Firefox 139+, а Safari, як очікується, з’явиться незабаром. Полізаповнення також доступне для непідтримуваних браузерів і Node.js. Temporal API створює об’єкти, які, як правило, представляють моменти часу. Це можуть бути позначки повного робочого часу та дати в певному часовому поясі або це може бути загальний екземпляр часу «настінного годинника» без будь-якої інформації про часовий пояс чи дату. Деякі з основних особливостей Temporal включають:
Часи з датами або без них. Тимчасовий об’єкт може представляти певний час певної дати або час без будь-якої інформації про дату. Також може бути представлена конкретна дата без часу. Підтримка часового поясу. Тимчасові об’єкти повністю розпізнають часовий пояс і можуть конвертуватися в різні часові пояси. Moment також підтримує часові пояси, але для цього потрібна додаткова бібліотека moment-timezone. Незмінність. Після створення тимчасового об’єкта його неможливо змінити. Арифметика часу або перетворення часових поясів не змінюють базовий об’єкт. Натомість вони генерують новий тимчасовий об’єкт. Індексація на основі 1. Поширеним джерелом помилок з API дати (а також з Moment) є те, що місяці мають нульовий індекс. Це означає, що січень є місяцем 0, а не місяцем 1, як ми всі розуміємо в реальному житті. Temporal виправляє це за допомогою індексування на основі 1 — січень є місяцем 1. Він вбудований у браузер. Оскільки Temporal є API у самому браузері, він нічого не додає до розміру комплекту програми.
Також важливо зазначити, що API дат не зникне. Хоча Temporal замінює цей API, він не видаляється чи не підтримується. Багато програм зламалися б, якби браузери раптово видалили Date API. Однак майте на увазі, що Moment тепер вважається застарілим проектом у режимі обслуговування. У решті статті ми розглянемо деякі «рецепти» перенесення коду на основі Moment до нового Temporal API. Почнемо рефакторинг! Створення об’єктів дати та часу Перш ніж ми зможемо маніпулювати датами та часом, ми повинні створити об’єкти, які їх представляють. Щоб створити об’єкт Moment, що представляє поточну дату й час, скористайтеся функцією moment. const зараз = момент(); console.log(зараз); // Момент<2026-02-18T21:26:29-05:00>
Тепер цей об’єкт можна форматувати або змінювати за потреби.
// конвертувати в UTC //попередження: це змінює об’єкт Moment і переводить його в режим UTC! console.log(now.utc()); // Момент<2026-02-19T02:26:29Z>
// надрукувати відформатований рядок - зауважте, що зараз використовується час UTC console.log(now.format('MM/DD/YYYY hh:mm:ss a')); // 19.02.2026 02:27:07 ранку
Головне, що слід пам’ятати про Moment, це те, що об’єкт Moment завжди містить інформацію про час і дату. Якщо вам потрібно працювати лише з інформацією про час, зазвичай це добре, але це може спричинити неочікувану поведінку в таких ситуаціях, як літній час або високосні роки, коли дата може вплинути на обчислення часу. Скроневий більш гнучкий. Ви можете створити об’єкт, що представляє поточну дату й час, створивши об’єкт Temporal.Instant. Це являє собою момент часу, визначений часом з «епохи» (опівночі за UTC 1 січня 1970 року). Temporal може посилатися на цей момент часу з точністю до наносекунд. const now = Temporal.Now.instant();
// побачити необроблені наносекунди з епохи console.log(now.epochNanoseconds); // 1771466342612000000n
// формат для UTC console.log(now.toString()); // 2026-02-19T01:55:27.844Z
// формат для певного часового поясу console.log(now.toString({ timeZone: 'America/New_York' })); // 2026-02-18T20:56:57.905-05:00
Об’єкти Temporal.Instant також можна створити для певного часу та дати за допомогою статичного методу from.
const myInstant = Temporal.Instant.from('2026-02-18T21:10:00-05:00');
// Відформатувати момент у місцевому часовому поясі. Зауважте, що це лише контроль // форматування - воно не змінює об'єкт, як це робить moment.utc. console.log(myInstant.toString({ timeZone: 'America/New_York' })); // 2026-02-18T21:10:00-05:00
Ви також можете створювати інші типи тимчасових об’єктів, зокрема:
Temporal.PlainDate: дата без інформації про час. Temporal.PlainTime: час без інформації про дату. Temporal.ZonedDateTime: дата й час у певному часовому поясі.
Кожен із них має метод from, який можна викликати за допомогою об’єкта, що вказує дату та/або час, або рядок дати для аналізу. // Просто побачення const today = Temporal.PlainDate.from({ рік: 2026, місяць: 2, // зауважте, що ми використовуємо 2 для лютого день: 18 }); console.log(today.toString()); // 2026-02-18
// Просто час const lunchTime = Temporal.PlainTime.from({ година: 12 }); console.log(lunchTime.toString()); // 12:00:00
// Дата й час у східному часовому поясі США const dueAt = Temporal.ZonedDateTime.from({ часовий пояс: 'Америка/Нью-Йорк', рік: 2026, місяць: 3, день: 1, година: 12, хвилина: 0, другий: 0 }); console.log(dueAt.toString()); // 2026-03-01T12:00:00-05:00[Америка/Нью-Йорк]
Розбір Ми розглянули програмне створення інформації про дату й час. Тепер розглянемо розбір. Аналіз — це одна з областей, де Moment є більш гнучким, ніж вбудований Temporal API. Ви можете проаналізувати рядок дати, передавши його функції moment. З одним аргументом Moment очікує рядок дати ISO, але ви можете використовувати альтернативні формати, якщо надасте другий аргумент, який визначає формат дати, який використовується.
const isoDate = moment('2026-02-21T09:00:00'); const formattedDate = moment('2/21/26 9:00:00', 'M/D/YY h:mm:ss');
console.log(isoDate); // Момент<2026-02-21T09:00:00-05:00>
console.log(formattedDate); // Момент<2026-02-21T09:00:00-05:00>
У старіших версіях Moment найкраще припустив аналіз будь-якого довільно відформатованого рядка дати. Це може призвести до непередбачуваних результатів. Наприклад, 02-03-2026 2 лютого чи 3 березня? З цієї причини новіші версії Moment відображають помітне попередження про застаріле, якщо його викликають без рядка дати у форматі ISO (якщо не вказано другий аргумент із потрібним форматом). Temporal аналізуватиме лише спеціально відформатований рядок дати. Рядок має відповідати формату ISO 8601 або його розширенню RFC 9557. Якщо в метод from передається невідповідний рядок дати, Temporal видасть RangeError.
// Використання рядка дати RFC 9557 const myDate = Temporal.Instant.from('2026-02-21T09:00:00-05:00[Америка/Нью-Йорк]'); console.log(myDate.toString({ timeZone: 'America/New_York' })); // 2026-02-21T09:00:00-05:00
// Використання невідомого рядка дати const otherDate = Temporal.Instant.from('2/21/26 9:00:00'); // RangeError: Тимчасова помилка: Недійсний символ під час аналізу значення року.
Точні вимоги до рядка дати залежать від типу тимчасового об’єкта, який ви створюєте. У наведеному вище прикладі для Temporal.Instant потрібен повний ISOРядок дати 8601 або RFC 9557 із зазначенням дати й часу зі зміщенням часового поясу, але ви також можете створити об’єкти PlainDate або PlainTime, використовуючи лише підмножину формату дати. 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
Зауважте, що ці рядки все одно мають відповідати очікуваному формату, інакше виникне помилка.
// Використання невідповідних рядків часу. Усе це призведе до RangeError. Temporal.PlainTime.from('9:00'); Temporal.PlainTime.from('9:00:00 AM');
Професійна порада: робота з рядками, відмінними від ISO. Оскільки Temporal надає пріоритет надійності, він не намагатиметься вгадати формат рядка, наприклад 02-01-2026. Якщо ваше джерело даних використовує такі рядки, вам потрібно буде виконати деякі маніпуляції з рядками, щоб перевпорядкувати значення в рядок ISO, наприклад 2026-02-01, перш ніж спробувати використовувати його з Temporal.
Форматування Якщо у вас є об’єкт Moment або Temporal, ви, ймовірно, захочете в якийсь момент перетворити його на відформатований рядок. Це випадок, коли Moment є трохи стислішим. Ви викликаєте метод формату об’єкта за допомогою рядка токенів, які описують потрібний формат дати. const date = moment();
console.log(date.format('MM/DD/YYYY')); // 22.02.2026
console.log(date.format('MMMM Do YYYY, h:mm:ss a')); // 22 лютого 2026, 20:18:30
З іншого боку, Temporal вимагає від вас бути більш багатослівним. Тимчасові об’єкти, такі як Instant, мають метод toLocaleString, який приймає різні параметри форматування, указані як властивості об’єкта.
const date = Temporal.Now.instant();
// без аргументів ми отримаємо стандартний формат для поточної локалі console.log(date.toLocaleString()); // 22.02.2026, 20:23:36 (припускається, що мова en-US)
// передаємо параметри форматування для генерації рядка спеціального формату console.log(date.toLocaleString('en-US', { місяць: 'довгий', день: 'numeric', рік: 'numeric', година: '2-цифровий', хвилина: "2 цифри" })); // 22 лютого 2026 о 20:23
// передавайте лише ті поля, які вам потрібні у рядку формату console.log(date.toLocaleString('en-US', { місяць: 'короткий', день: 'numeric' })); // 22 лютого
Тимчасове форматування дати фактично використовує API Intl.DateTimeFormat (який уже доступний у сучасних браузерах) під капотом. Це означає, що ви можете створити повторно використовуваний об’єкт DateTimeFormat із власними параметрами форматування, а потім передати тимчасові об’єкти його методу форматування. Через це він не підтримує спеціальні формати дати, як це робить Moment. Якщо вам потрібне щось на кшталт «Q1 2026» або інше спеціалізоване форматування, вам може знадобитися спеціальний код форматування дати або звернутися до сторонньої бібліотеки. const formatter = new Intl.DateTimeFormat('en-US', { місяць: '2-значний', день: '2-цифровий', рік: 'numeric' });
const date = Temporal.Now.instant(); console.log(formatter.format(date)); // 22.02.2026
Маркери форматування Moment простіше написати, але вони незручні для локалі. Формат містить рядки «твердого коду», наприклад порядок місяць/день. Перевага використання об’єкта конфігурації, як це робить Temporal, полягає в тому, що він автоматично адаптується до будь-якої локалі та використовує правильний формат. const date = Temporal.Now.instant();
const formatOptions = { місяць: 'numeric', день: 'numeric', рік: 'numeric' };
console.log(date.toLocaleString('en-US', formatOptions)); // 22.02.2026
console.log(date.toLocaleString('en-GB', formatOptions)); // 22.02.2026
Обчислення дати У багатьох програмах вам потрібно буде виконати певні обчислення на дату. Ви можете додати або відняти одиниці часу (дні, години, секунди тощо). Наприклад, якщо у вас є поточна дата, ви можете показати користувачеві дату через 1 тиждень. Об’єкти Moment мають такі методи, як додавання та віднімання, які виконують ці операції. Ці функції приймають значення та одиницю, наприклад: add(7, 'дні'). Однак одна дуже важлива відмінність між Moment і Temporal полягає в тому, що під час виконання цих обчислень дати основний об’єкт змінюється, а його вихідне значення втрачається. const зараз = момент();
console.log(зараз); // Момент<2026-02-24T20:08:36-05:00>
const nextWeek = now.add(7, 'дні'); console.log(nextWeek); // Момент<2026-03-03T20:08:36-05:00>
// Зрозуміло - вихідний об'єкт був мутований console.log(зараз); // Момент<2026-03-03T20:08:36-05:00>
Щоб уникнути втрати вихідної дати, ви можете викликати clone для об’єкта Moment, щоб створити копію. const зараз= момент(); const nextWeek = now.clone().add(7, 'дні');
console.log(зараз); // Момент<2026-02-24T20:12:55-05:00>
console.log(nextWeek); // Момент<2026-03-03T20:12:55-05:00>
З іншого боку, тимчасові об’єкти є незмінними. Якщо ви створили такий об’єкт, як Instant, PlainDate тощо, значення цього об’єкта ніколи не зміниться. Тимчасові об’єкти також мають методи додавання та віднімання. Temporal трохи вибагливий щодо того, які одиниці часу можна додати до яких типів об’єктів. Наприклад, ви не можете додати дні до миттєвого пошуку:
const now = Temporal.Now.instant(); const nextWeek = now.add({ днів: 7 }); // RangeError: Тимчасова помилка: Найбільша одиниця не може бути одиницею дати
Це пояснюється тим, що миттєві об’єкти представляють певний момент часу в UTC і не залежать від календаря. Оскільки тривалість дня може змінюватися залежно від правил часового поясу, наприклад переходу на літній час, цей розрахунок недоступний для миттєвого пошуку. Однак ви можете виконати цю операцію з іншими типами об’єктів, такими як PlainDateTime: const now = Temporal.Now.plainDateTimeISO(); console.log(now.toLocaleString()); // 24.02.2026, 20:23:59
const nextWeek = now.add({ днів: 7 });
// Зауважте, що вихідний PlainDateTime залишається незмінним console.log(now.toLocaleString()); // 24.02.2026, 20:23:59
console.log(nextWeek.toLocaleString()); // 03.03.2026, 20:23:59
Ви також можете обчислити проміжок часу між двома об’єктами Moment або Temporal. За допомогою функції diff у Moment вам потрібно вказати одиницю деталізації, інакше вона поверне різницю в мілісекундах. const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');
console.log(date2.diff(date1)); // 91800000
console.log(date2.diff(date1, 'дні')); // 1
Щоб зробити це з об’єктом Temporal, ви можете передати інший об’єкт Temporal його методам until або since. Це повертає об’єкт Temporal.Duration, що містить інформацію про різницю в часі. Об’єкт Duration має властивості для кожного компонента різниці, а також може генерувати рядок тривалості ISO 8601, що представляє різницю в часі.
const date1 = Temporal.PlainDateTime.from('2026-02-21T09:00:00'); const date2 = Temporal.PlainDateTime.from('2026-02-22T10:30:00');
// largeUnit визначає найбільшу одиницю часу для представлення // при розрахунку тривалості const diff = date2.since(date1, { largeUnit: 'day' });
console.log(diff.days); // 1
console.log(diff.hours); // 1
console.log(diff.minutes); // 30
console.log(diff.toString()); // P1DT1H30M // (рядок тривалості ISO 8601: 1 день, 1 година, 30 хвилин)
Порівняння дат і часу І Moment, і Temporal дозволяють порівнювати дати та час, щоб визначити, що передує іншому, але застосовують різні підходи до API. Moment надає такі методи, як isBefore, isAfter і isSame для порівняння двох об’єктів Moment. const date1 = moment('2026-02-21T09:00:00'); const date2 = moment('2026-02-22T10:30:00');
console.log(date1.isBefore(date2)); // правда
Temporal використовує метод статичного порівняння для порівняння двох об’єктів одного типу. Повертає -1, якщо перша дата передує другій, 0, якщо вони рівні, або 1, якщо перша дата стоїть після другої. У наступному прикладі показано, як порівняти два об’єкти PlainDate. Обидва аргументи Temporal.PlainDate.compare мають бути об’єктами PlainDate.
const date1 = Temporal.PlainDate.from({ рік: 2026, місяць: 2, день: 24 }); const date2 = Temporal.PlainDate.from({ рік: 2026, місяць: 3, день: 24 });
// дата1 передує даті2, тому -1 console.log(Temporal.PlainDate.compare(date1, date2));
// Помилка, якщо ми намагаємося порівняти два об'єкти різних типів console.log(Temporal.PlainDate.compare(date1, Temporal.Now.instant())); // TypeError: Тимчасова помилка: надано недійсні поля PlainDate.
Зокрема, це полегшує сортування масиву тимчасових об’єктів у хронологічному порядку. // Масив об'єктів Temporal.PlainDate const dates = [ ... ];
// використовувати Temporal.PlainDate.compare як функцію порівняння dates.sort(Temporal.PlainDate.compare);
Перетворення часових поясів Основна бібліотека Moment не підтримує перетворення часових поясів. Якщо вам потрібна ця функція, вам також потрібно встановити пакет moment-timezone. Цей пакунок не можна трясти, тому він може значно збільшити розмір набору. Після встановлення moment-timezone ви можете конвертувати об’єкти Moment у різні часові пояси за допомогою методу tz. Як і з іншими операціями Moment, це змінює базовийоб'єкт. // За східним часом США const зараз = момент(); console.log(зараз); // Момент<2026-02-28T20:08:20-05:00>
// Перетворення на тихоокеанський час. // Оригінальний східний час втрачено. now.tz('Америка/Лос_Анджелес'); console.log(зараз); // Момент<2026-02-28T17:08:20-08:00>
Під час використання об’єкта Temporal.ZonedDateTime у API Temporal вбудовано функції часового поясу. Ці об’єкти включають метод withTimeZone, який повертає новий ZonedDateTime, що представляє той самий момент часу, але в указаному часовому поясі. // Знову ж таки, припускаючи східний час США const now = Temporal.Now.zonedDateTimeISO(); console.log(now.toLocaleString()); // 28.02.2026, 20:12:02 EST
// Перетворення на тихоокеанський час const nowPacific = now.withTimeZone('Америка/Лос_Анджелес'); console.log(nowPacific.toLocaleString()); // 28.02.2026, 17:12:02 PST
// Вихідний об'єкт залишається незмінним console.log(now.toLocaleString()); // 28.02.2026, 20:12:02 EST
Примітка. Відформатовані значення, які повертає toLocaleString, як випливає з назви, залежать від локалі. Зразок коду було розроблено для мови en-US, тому формат такий: 2/28/2026, 17:12:02 за тихоокеанським стандартним часом. В іншому регіоні це може бути іншим. Наприклад, у локалі en-GB ви отримаєте щось на зразок 28/2/2026, 17:12:02 GMT-8. Рефакторинг у реальному світі Припустімо, ми створюємо програму для планування подій у різних часових поясах. Частиною цієї програми є функція getEventTimes, яка приймає рядок ISO 8601, що представляє час і дату події, місцевий часовий пояс і цільовий часовий пояс. Функція створює відформатовані рядки часу та дати для події в обох часових поясах. Якщо функції надано рядок введення, який не є дійсним рядком часу/дати, вона видасть помилку. Ось оригінальна реалізація з використанням Moment (також вимагає використання пакета moment-timezone).
імпорт моменту з 'moment-timezone';
функція getEventTimes(inputString, userTimeZone, targetTimeZone) { const timeFormat = 'МММ Д, РРРР, год:хх:сс а z';
// 1. Створити початковий момент у часовому поясі користувача const eventTime = moment.tz( inputString, moment.ISO_8601, // Очікуйте рядок ISO 8601 правда, // Суворий розбір userTimeZone );
// Видає помилку, якщо inputString не представляє дійсну дату if (!eventTime.isValid()) { кинути нову помилку ('Невірний вхід дати/часу'); }
// 2. Розрахувати цільовий час // КРИТИЧНО: ми повинні клонувати, інакше 'eventTime' зміниться назавжди! const targetTime = eventTime.clone().tz(targetTimeZone);
return { локальний: eventTime.format(timeFormat), target: targetTime.format(timeFormat), }; }
const schedule = getEventTimes( '2026-03-05T15:00-05:00', "Америка/Нью-Йорк", "Європа/Лондон", );
console.log(schedule.local); // 5 березня 2026 р., 15:00:00 EST
console.log(schedule.target); // 5 березня 2026 р., 20:00:00 GMT
У цьому прикладі ми використовуємо очікуваний формат дати ISO 8601, який зручно вбудовано в Moment. Ми також використовуємо строгий аналіз, що означає, що Moment не намагатиметься вгадати рядок дати, який не відповідає формату. Якщо передано рядок дати, що не відповідає ISO, це призведе до недійсного об’єкта дати, і ми видамо помилку. Тимчасова реалізація виглядає подібно, але має кілька ключових відмінностей.
функція getEventTimes(inputString, userTimeZone, targetTimeZone) { // 1. Проаналізуйте вхідні дані безпосередньо в Instant, а потім створіть // a ZonedDateTime у зоні користувача. const instant = Temporal.Instant.from(inputString); const eventTime = instant.toZonedDateTimeISO(userTimeZone);
// 2. Перетворення в цільову зону // Це автоматично повертає НОВИЙ об'єкт; 'eventTime' є безпечним. const targetTime = eventTime.withTimeZone(targetTimeZone);
// 3. Форматувати за допомогою Intl (вбудований) const options = { рік: 'numeric', місяць: 'короткий', день: 'numeric', година: 'numeric', хвилина: '2-цифровий', другий: '2-цифровий', timeZoneName: 'короткий' };
return { локальний: eventTime.toLocaleString(navigator.language, параметри), target: targetTime.toLocaleString(navigator.language, параметри) }; }
const schedule = getEventTimes( '2026-03-05T15:00-05:00', "Америка/Нью-Йорк", "Європа/Лондон", );
console.log(schedule.local); // 5 березня 2026 р., 15:00:00 EST
console.log(schedule.target); // 5 березня 2026 р., 20:00:00 GMT
У Moment ми повинні явно вказати рядок формату для кінцевих рядків дати. Незалежно від місцезнаходження користувача чи регіону, час подій завжди матиме такий формат: 5 березня 2026 р., 3:00:00вечора EST. Крім того, ми не повинні явно викидати виняток. Якщо до Temporal.Instant.from передано недійсний рядок, Temporal створить для нас виняток. Одне, що слід зазначити, це те, що навіть із суворим аналізом версія Moment все ще більш м’яка. Temporal вимагає зміщення часового поясу в кінці рядка. Слід також зауважити, що оскільки ми використовуємо navigator.language, цей код буде працювати лише в середовищі браузера, оскільки навігатор не визначено в середовищі Node.js. Тимчасова реалізація використовує поточну мову веб-переглядача (navigator.language), тому користувач автоматично отримуватиме час подій у форматі місцевого часу. На українській мові це 5 березня 2026 року, 15:00:00 EST. Однак якщо користувач перебуває, наприклад, у Лондоні, час події буде відформатовано як 5 березня 2026 р., 15:00:00 GMT-5. Резюме
Дія Moment.js Скроневий Поточний час момент() Temporal.Now.zonedDateTimeISO() Розбір ISO момент (str) Temporal.Instant.from(str) Додайте час .add(7, 'дні') (змінюється) .add({ днів: 7 }) (новий об'єкт) Різниця .diff(інше, 'години') .з (інших).годин Часовий пояс .tz('Зона/Назва') .withTimeZone('Зона/Назва')
На перший погляд, різниця може полягати в дещо іншому (а у випадку Temporal, іноді більш детальному та суворому) синтаксисі, але є кілька ключових переваг використання Temporal над Moment.js:
Бути більш явним означає менше несподіванок і ненавмисних помилок. Момент може здатися більш м’яким, але він передбачає «припущення», що іноді може призвести до неправильних дат. Якщо ви надаєте Temporal щось недійсне, це видає помилку. Якщо код працює, ви знаєте, що у вас дійсна дата. Moment може значно збільшити пакет програми, особливо якщо ви використовуєте пакет moment-timezone. Temporal нічого не додає (якщо його буде доставлено у ваші цільові браузери). Незмінність дає вам впевненість, що ви ніколи не втратите або перезапишете дані під час виконання перетворень дат і операцій. Різні представлення часу (Instant, PlainDateTime, ZonedDateTime) залежно від ваших вимог, де Moment завжди є обгорткою навколо мітки часу UTC. Temporal використовує Intl API для форматування дати, що означає, що ви можете мати форматування з урахуванням локалі без необхідності явно вказувати маркери.
Примітки щодо Polyfill Як згадувалося раніше, доступний Temporal polyfill, який поширюється як пакет npm під назвою @js-temporal/polyfill. Якщо ви хочете використовувати Temporal сьогодні, вам знадобиться цей polyfill для підтримки таких браузерів, як Safari, які ще не постачали API. Погана новина полягає в тому, що це збільшить розмір вашого пакета. Хороша новина полягає в тому, що він все ще додає значно менше, ніж момент або часовий пояс моменту. Ось порівняння розмірів пакетів, як повідомляє Bundlephobia.com, веб-сайт, який представляє інформацію про розміри пакетів npm (клацніть назву кожного пакета, щоб переглянути аналіз Bundlephobia):
Пакет Зменшений Згорнуто та заархівовано @js-temporal/polyfill 154,1 кБ 44,1 кБ момент 294,4 кБ 75,4 кБ момент-часовий пояс 1 Мб 114,2 кБ
У поліфілу також історично були деякі проблеми з продуктивністю, пов’язані з використанням пам’яті, і на момент написання статті він вважався в альфа-стані. Через це ви можете не використовувати його у виробництві, доки він не досягне більш зрілого стану. Інша хороша новина полягає в тому, що, сподіваюся, polyfill не знадобиться довго (звичайно, якщо вам не потрібна підтримка старих браузерів). На момент написання статті Temporal поставлявся в Chrome, Edge і Firefox. Він ще не зовсім готовий у Safari, хоча, здається, він доступний із прапором часу виконання в останньому технологічному перегляді.