JavaScript предоставляет встроенный объект Date, который позволяет разработчикам работать с датами и временем. С объектом Date вы можете выполнять различные операции, такие как получение текущей даты и времени, сравнение дат и форматирование дат.

Доступ к объекту Date осуществляется через глобальную функцию Date. Чтобы создать объект Date, вы можете передать строку даты в функцию Date, например:

let date = new Date("December 14, 2022");

Вы также можете создать объект Date, используя отдельные значения даты и времени, например:

let date = new Date(2022, 11, 14, 12, 0, 0);

Объект Date имеет несколько методов, позволяющих получить информацию о дате и времени, таких как год, месяц, день, час, минута и секунда. Например, вы можете использовать метод getFullYear() для получения года и метод getMonth() для получения месяца.

let date = new Date("December 14, 2022");
let year = date.getFullYear(); // 2022
let month = date.getMonth(); // 11
// ...

Помимо встроенного объекта Date, есть также несколько библиотек, облегчающих работу с датами в JavaScript.

Дайс

Day.js — это небольшая, быстрая и неизменяемая библиотека дат, которая предоставляет API, аналогичный Moment.js. Чтобы установить day.js, вы можете использовать менеджер пакетов npm, например:

npm install dayjs

1. Базовое получение текущей даты и времени с помощью dayjs в JavaScript

После того, как вы установили day.js, вы можете создать объект day.js, используя функцию dayjs(),

// Get the current date and time using dayjs
const now = dayjs();
// Format the date and time
console.log(now.format('MM/DD/YYYY, h:mm:ss a')); // 12/14/2022, 10:15:30 am
// Parse a date string using dayjs
const dateString = '2022-12-14';
const date = dayjs(dateString);
// Format the date using dayjs
console.log(date.format('MM/DD/YYYY')); // 12/14/2022

2. Управление датами с помощью dayjs в JavaScript

// Parse a date string using dayjs
const dateString = '2022-12-14';
const date = dayjs(dateString);
// Add one month to the date
const nextMonth = date.add(1, 'month');
// Subtract two days from the date
const previousTwoDays = date.subtract(2, 'day');
// Check if the date is before a given date
const isBefore = date.isBefore('2022-12-20');

3. Сравнение дат с dayjs в JavaScript»

// let's create some dates to work with
const date1 = dayjs('2022-12-14');
const date2 = dayjs('2022-12-15');
// Check if date1 is before date2
console.log(date1.isBefore(date2)); // Output: true
// Check if date1 is after date2
console.log(date1.isAfter(date2)); // Output: false
// Check if date1 is the same as date2
console.log(date1.isSame(date2)); // Output: false

Вы также можете сравнить две даты, используя метод .isSame(), который возвращает логическое значение, указывающее, совпадают ли две даты.

const firstDate = dayjs('2022-12-01');
const secondDate = dayjs('2022-12-31');
const thirdDate = dayjs('2022-12-01');
// Check if the first and second dates are the same
console.log(firstDate.isSame(secondDate)); // Output: false
// Check if the first and second dates are the same year
console.log(firstDate.isSame(secondDate,'year')); // Output: true
// Check if the first and third dates are the same
console.log(firstDate.isSame(thirdDate)); // Output: true

Вы также можете указать уровень точности для сравнения дат, используя второй аргумент метода .isSame(). Например, вы можете сравнить только год, месяц или день, передав строку 'year', 'month' или 'day' соответственно.

4. Сортировка дат с помощью dayjs в JavaScript

Метод sort можно использовать для сортировки массива дат в порядке возрастания или убывания. Например:

let dates = [  dayjs('2022-12-14T12:00:00'),  dayjs('2022-12-13T12:00:00'),  dayjs('2022-12-15T12:00:00')];
dates.sort((a, b) => a.diff(b)); // sort dates in ascending order
dates.sort((a, b) => b.diff(a)); // sort dates in descending order

Методы min и max можно использовать для поиска самой ранней и самой поздней дат в массиве дат соответственно. Например:

let dates = [ dayjs('2022-12-14T12:00:00'),  dayjs('2022-12-13T12:00:00'),  dayjs('2022-12-15T12:00:00')];
let earliestDate = dates.reduce((a, b) => a.isBefore(b) ? a : b);
let latestDate = dates.reduce((a, b) => a.isAfter(b) ? a : b);
console.log(earliestDate) // '17:10 12/14/2022'
console.log(latestDate)   // '17:10:14 2022-12-14'

5. Отныне

Работа этого зависит от плагина [RelativeTime](https://day.js.org/docs/en/plugin/relative-time)

RelativeTime добавляет .from .to .fromNow .toNow API для форматирования даты в строки относительного времени (например, 3 часа назад). документы

Если вы передадите true, вы можете получить значение без суффикса.

import dayjs from "dayjs";
import relativeTime from "dayjs/plugin/relativeTime";
dayjs.extend(relativeTime);
dayjs("1997-18-03").fromNow(); // '25 years ago'
dayjs("1997-18-03").fromNow(true); // '25 years'

+--------------------------+-----+----------------------------------+
|          Range           | Key |          Sample Output           |
+--------------------------+-----+----------------------------------+
| 0 to 44 seconds          | s   | a few seconds ago                |
| 45 to 89 seconds         | m   | a minute ago                     |
| 90 seconds to 44 minutes | mm  | 2 minutes ago ... 44 minutes ago |
| 45 to 89 minutes         | h   | an hour ago                      |
| 90 minutes to 21 hours   | hh  | 2 hours ago ... 21 hours ago     |
| 22 to 35 hours           | d   | a day ago                        |
| 36 hours to 25 days      | dd  | 2 days ago ... 25 days ago       |
| 26 to 45 days            | M   | a month ago                      |
| 46 days to 10 months     | MM  | 2 months ago ... 10 months ago   |
| 11 months to 17months    | y   | a year ago                       |
| 18 months+               | yy  | 2 years ago ... 20 years ago     |
+--------------------------+-----+----------------------------------+

Две популярные хорошие библиотеки: Day.js и date-fns. Обе библиотеки предлагают ряд методов для работы с датами и временем и известны своим небольшим размером и производительностью.

Мы обнаружили, что date-fns имеет наименьший размер в наших тестах, всего 1,6 КиБ при использовании только одного метода. Однако при использовании большего количества методов преимущество date-fns в размере уменьшалось, в результате чего конечный размер составлял 3,63 КБ при использовании веб-пакета и 3,6 КБ при использовании esbuild.

С другой стороны, Day.js предлагает API, аналогичный API Moment.js, что делает его привлекательным вариантом для проектов, которые уже используют Moment.js. В наших тестах Day.js был немного больше, чем date-fns, с размером 6,64 КиБ при использовании webpack и 7,0 КиБ при использовании esbuild. Однако Day.js требует использования плагинов для некоторых методов, что может увеличить общий размер библиотеки.

Конец

В целом, date-fns — лучший выбор для проектов, которые обеспокоены размером сборки, а Day.js — хороший вариант для проектов, которые хотят перейти с Moment.js.