Библиотека JS Moment для парсинга, валидации, манипуляции, отображения и форматирования дат
JS Moment - популярная javascript библиотека для работы с датами и временем. Она решает множество задач: парсинг, валидация, манипуляция, отображение и форматирование дат. В этой статье мы подробно разберем основные возможности Moment для управления временем и форматами в js.
1. Основы Moment.js
Moment.js была создана в 2011 году Тимом Вудом для упрощения работы с датами и временем в JavaScript. На тот момент стандартный объект Date JavaScript имел ряд недостатков, что затрудняло его использование.
Первая версия Moment.js вышла в сентябре 2011 года. На данный момент актуальная версия - 2.29.4 от февраля 2023 года. За прошедшие годы библиотека значительно расширила функционал и улучшила производительность.
В разработке Moment.js принимали участие десятки контрибьюторов со всего мира. Основная команда:
- Тим Вуд - создатель и мейнтейнер проекта
- Искрен Чернев - ключевой разработчик
- Мэгги Ву - мейнтейнер документации
Основные цели и задачи Moment.js:
- Простота и удобство работы с датами в JS
- Парсинг, валидация и форматирование дат
- Манипуляции с датами: сложение, вычитание и т.д.
- Мультиязычная поддержка локализации
- Работа с часовыми поясами и смещениями
- Легковесность и производительность
Подключение Moment.js
Подключить Moment.js можно разными способами:
- Через CDN сервисы как jsDelivr или cdnjs
- Установить через npm
- Подключить напрямую js файл библиотеки
После подключения становится доступен глобальный объект moment.
Создание объекта Moment
Для начала работы нужно создать объект Moment. Это можно сделать вызовом конструктора moment() без параметров:
const now = moment();
Это аналогично вызову moment(new Date())
и создаст объект с текущей датой и временем.
Парсинг дат
Объект Moment можно создать из строки, числа, массива или объекта Date:
- Из строки в формате ISO 8601:
moment("2020-01-25")
- Из unix-таймштампа в секундах:
moment(1585180400)
- Из массива наподобие new Date():
moment([2020, 1, 25])
- Из объекта Date:
moment(new Date())
Поддерживается парсинг дат в различных форматах: ISO, RFC 2822 и другие.
Валидация дат
Проверить валидность созданного объекта Moment можно с помощью moment().isValid()
.
А метод moment().invalidAt()
вернет причину, по которой дата невалидна.
Получение и установка значений
Для работы с компонентами даты в Moment есть удобные геттеры и сеттеры:
moment().year()
- годmoment().month()
- месяцmoment().date()
- день месяцаmoment().hour()
- часыmoment().minute()
- минуты
Вызов без аргументов - геттер, с аргументом - сеттер значения.
Прибавление и вычитание времени
Для прибавления и вычитания времени есть методы moment().add()
и moment().subtract()
:
moment().add(7, 'days') // прибавить 7 дней moment().subtract(1, 'months') // вычесть 1 месяц
Поддерживаются единицы измерения: годы, месяцы, недели, дни, часы, минуты, секунды, миллисекунды.
Сравнение, проверка диапазонов дат
Для сравнения дат в Moment есть ряд методов:
isBefore()
- раньше другой датыisAfter()
- позже другой датыisBetween()
- внутри интервала
Можно указать точность сравнения: по дням, месяцам, годам и т.д.
Форматирование дат
Для форматирования даты в строку используется moment().format()
:
moment().format('DD/MM/YYYY')
Поддерживаются разнообразные токены форматирования: YYYY, MMM, DD
и другие.
Работа со временем и часовыми поясами
Moment.js позволяет гибко управлять представлением времени - в локальном или UTC формате, применять смещения часовых поясов и многое другое.
Локальное и UTC время
По умолчанию Moment работает с локальным временем. Для переключения в UTC режим используется метод moment.utc()
:
const local = moment(); const utc = moment.utc();
Переключение обратно в локальный режим осуществляется с помощью moment().local()
.
Часовые пояса и смещения
Чтобы задать часовой пояс, можно использовать moment().zone(num)
, где num - смещение от UTC в минутах.
А метод moment().utcOffset(num)
позволяет установить смещение напрямую.
Летнее время и сдвиги
Проверить, попадает ли дата на летнее время, можно с помощью moment().isDST()
.
А moment().isDSTShifted()
определит, была ли дата сдвинута при переходе на летнее время.
Контроль точности
Чтобы задать часовой пояс для сравнения дат, используется moment().withZone(tz)
. Это позволяет корректно сравнивать моменты времени с учетом часовых поясов.
Интернационализация и локали
Moment.js имеет развитую поддержку локализации и может адаптировать отображение дат для разных языков и регионов.
Загрузка локалей
Чтобы загрузить локаль для языка, используется moment.locale(name, object)
:
moment.locale('ru', {...});
В object передается информация о форматах, названиях месяцев, дней недели и пр. для данной локали.
Установка локали
После загрузки локаль можно активировать вызовом: moment.locale('ru');
Это изменит локаль для всех моментов, созданных в дальнейшем.
Форматы дат для локалей
Для локалей определяются специальные форматы дат:
LL
- 01 января 2021LLL
- 01 января 2021 15:45LLLL
- четверг, 01 января 2021 15:45
Они используются в moment().format(format)
для локализованного форматирования.
Плюрализация
Для локалей также настраивается плюрализация единиц измерения при локализации:
- 1 minute ago
- 2 minutes ago
Это используется в методах вроде moment().fromNow()
.
Форматирование строк
Moment.js позволяет гибко форматировать даты в строки с помощью системы токенов.
Токены форматирования
Основные токены форматирования:
YYYY
- годMM
- месяцDD
- деньHH
- часыmm
- минутыss
- секунды
Они используются в moment().format(string)
:
moment().format('YYYY-MM-DD HH:mm')
В результате будет строка вида "2023-02-11 15:30".
Локальные токены
Для локализованного форматирования используются специальные токены:
L
- 01.02.2023LL
- 01 февраля 2023LLL
- 01 февраля 2023 15:35
Они форматируют дату согласно правилам локали.
Форматирование по умолчанию
По умолчанию используется формат moment.defaultFormat
- ISO8601.
В режиме UTC формат задается moment.defaultFormatUtc
.
Календарное форматирование
moment().calendar()
форматирует дату относительно сегодняшнего дня:
- Сегодня 15:20
- Завтра 15:20
- Во вторник 15:20
Форматы локализуются и настраиваются для каждой локали.