dayjs - любовь на века

В этой статье опишу всю боль по работе с built-in объектом new Date() и как эту боль не испытывать с библиотекой dayjs.
Итак, почему я остановился именно на этой библиотеке для работы со временем в JS? Давайте признаем, что работать со временем в ванильном js это сущий ад и кошмар, как и в принципе в любом ЯП без "ванильного сахара".
Итак, что мы делаем, когда хотим получить дату в формате YYYY-mm-dd на чистом JS:
const date = new Date();
// Получаем год, месяц и день
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // Месяцы начинаются с 0
const day = String(date.getDate()).padStart(2, '0');
// Форматируем дату в формате YYYY-MM-DD
const isoDate = `${year}-${month}-${day}`;
// 2025-05-18
То же самое значение получить в dayjs:
const date = dayjs().format("YYYY-mm-dd")
Другие примеры:
Прибавление 3 дней к текущей дате:
- чистый JS
// Создаем новый объект Date для текущей даты
const currentDate = new Date();
// Прибавляем 3 дня
currentDate.setDate(currentDate.getDate() + 3);
// Получаем год, месяц и день
const year = currentDate.getFullYear();
const month = String(currentDate.getMonth() + 1).padStart(2, '0'); // Месяцы начинаются с 0
const day = String(currentDate.getDate()).padStart(2, '0');
// Форматируем дату в формате YYYY-MM-DD
const isoDate = `${year}-${month}-${day}`;
- dayjs
const date = dayjs().add(3, 'day').format("YYYY-mm-dd");
В общем, дальше итак понятно, что работать с dayjs само удовольствие. Какую еще функциональность предлагает библиотека:
- парсинг даты
// Парсинг даты в формате ISO8601
dayjs('2018-04-04T16:00:00.000Z') // допускается и без T
dayjs('2018-04-13 19:18')
// Парсинг в своем формате
var customParseFormat = require("dayjs/plugin/customParseFormat");
// import customParseFormat from 'dayjs/plugin/customParseFormat' // ES 2015
dayjs.extend(customParseFormat);
dayjs("12-25-1995", "MM-DD-YY")
// Парсинг с локализацией
require('dayjs/locale/es')
dayjs('2018 Enero 15', 'YYY MMMM DD', 'es')
- геттеры и сеттеры
// использует перегруженные геттеры и сеттеры
// те, если dayjs().second() то это будет геттер
// dayjs().second(30) это будет сеттер
dayjs().second(30).valueOf() // => new Date().setSeconds(30)
dayjs().second() // => new Date().getSeconds()
// для месяца
dayjs().date() // получает день текущего месяца
dayjs().date(1) // возвращает новый объект dayjs
// для года
dayjs().year() // получает текущий год
dayjs().year(2000) // выдаёт новый объект dayjs
// и тд
- добавление
const a = dayjs()
const b = a.add(7, 'day')
Единица Сокращение Описание
day d День
week w Неделя
month M Месяц
quarter Q Квартал ( зависящий QuarterOfYear plugin )
year y Год
hour h Час
minute m Минута
second s Секунда
millisecond ms Миллисекунда
- вычитание
dayjs().subtract(7, 'year')
Остальное можно подчерпнуть из документации.
Как я подключаю библиотеку в своих проектах на Next.js:
'use client';
import 'dayjs/locale/ru';
import dayjs from 'dayjs';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import { LocalizationProvider as Provider } from '@mui/x-date-pickers/LocalizationProvider';
type Props = {
children: React.ReactNode;
};
export function LocalizationProvider({ children }: Props) {
dayjs.locale('ru');
return (
<Provider dateAdapter={AdapterDayjs} adapterLocale="ru">
{children}
</Provider>
);
}
// app/layout.tsx
type Props = {
children: React.ReactNode;
};
export default async function RootLayout({ children }: Props) {
return (
<html lang="ru" suppressHydrationWarning>
<body>
<LocalizationProvider>
{children}
</LocalizationProvider>
</body>
</html>
);
}
// использование
/** output: 17 Apr 2022
*/
export function fDate(date: DatePickerFormat, format?: string) {
if (!date) {
return null;
}
const isValid = dayjs(date).isValid();
return isValid ? dayjs(date).format(format ?? formatStr.date) : 'Неправильный формат даты';
}
В заключение хочется сказать, что библиотека очень компактная (~2kB) и функциональная. Использую повсеместно с удовольствием.
Обсуждение участников