Скільки ж болю нам приносить робота із датами всередині JavaScript, згодні? Коли розробник вперше починає працювати із датами за допомогою new Date
, у нього виникає дуже багато запитань. Наприклад, чому результат getMonth
починається з 0, а getHours
починає свій відлік з 1? Чому геть неможливо дістати назви місяців? А при роботі з таймзонами так взагалі легше застрелитися 🫠
Які є вбудовані альтернативи?
Наразі не існує ніяких вбудованих в JavaScript варіантів роботи із датами, окрім new Date
. Можливо, ви чули про Intl.DateTimeFormat
, але він більше призначений для форматування дат на основі якоїсь локалі. Проте, авжеж, має бути певний workaround.
Temporal
Вже довгий час існує proposal під назвою temporal, який повинен вирішити більшість проблем при роботі із датами. Цей proposal вже знаходиться на stage 3, тому його поява в JavaScript - це справа часу. API виглядає набагато зручніше new Date
та має більше функціонала.
Отримання поточного часу
Наступний виклик віддасть точний системний час разом із таймзоною.
Temporal.Now.instant(); // 2024-06-03T20:57:01.500944804Z
Робота з існуючими датами
Для роботи з існуючими датами є три методи: PlainTime
, PlainDate
та PlaneDateTime
. Виходячи із назв, можна зрозуміти їх призначення.
const date = Temporal.PlainDateTime.from({
year: 2006,
month: 11,
day: 24,
hour: 19,
minute: 39,
second: 9,
millisecond: 68,
microsecond: 346,
nanosecond: 205,
});
date.toString() // => '2006-11-24T19:39:09.068346205'
Всі властивості опціональні, тож використовувати їх необовʼязково, наприклад, nanosecond
.
Висновок
Temporal є дуже перспективним API для роботи із датами. Проте якщо ви не хочете чекати, поки він з'явиться в JavaScript, вже існує поліфіл. Можете встановлювати та використовувати це рішення, але я не рекомендую робити це на комерційних проєктах.
Якщо є бажання ознайомитися з API Temporal більш детально, переходьте на сторінку самого proposal на сайті tc39, де можна почитати про весь функціонал, наприклад, про роботу з таймзонами.
Які бібліотеки наразі є найкращими для роботи з датами?
Звісно, бібліотек для роботи із датами існує безліч, але я розповім про сучасні альтернативи moment та date-fns, бо хоч про них і знає кожен розробник, але вони дуже застарілі, тому я максимально не рекомендую використовувати їх на нових проєктах.
dayjs
Напевно, найзручніша бібліотека для роботи із датами для м'якого переходу з moment. Містить увесь потрібний функціонал та має багато плагінів та локалізацій.
dayjs('2019-01-25')
.add(1,'day')
.subtract(1,'year')
.year(2009)
.format('YYYY/MM/DD HH:mm');
Для прикладу, дану бібліотеку я використав при створенні сайту wannabe.school, тому рекомендую взяти її собі на озброєння.
Luxon
Бібліотека для роботи із датами від творців moment. Має більш зручний API, ніж moment.
DateTime
.now()
.setZone('America/New_York')
.minus({ weeks: 1 })
.endOf('day')
.toISO();
Tempo
Відносно нова бібліотека від крутої організації FormKit, яка за синтаксисом дуже нагадує date-fns, бо тут також потрібно імпортувати функцї для будь-яких маніпуляцій.
import { format, parse } from '@formkit/tempo';
const readable = format(new Date(), 'full');
parse(readable, 'full');
Висновок
Чекати Temporal може бути непоганою ідеєю, проте я цього не рекомендую, адже це буде доволі не скоро. Так само як і не раджу надалі використовувати moment чи date-fns, оскільки вони не підтримують нові підходи, наприклад, tree-shaking.
Тому придивіться до бібліотек dayjs, Luxon та Tempo, ознайомтеся із кожною детальніше, оберіть ту, яка імпонує найбільше, та використовуйте на нових проєктах саме її.