Библиотека 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 января 2021
  • LLL - 01 января 2021 15:45
  • LLLL - четверг, 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.2023
  • LL - 01 февраля 2023
  • LLL - 01 февраля 2023 15:35

Они форматируют дату согласно правилам локали.

Форматирование по умолчанию

По умолчанию используется формат moment.defaultFormat - ISO8601.

В режиме UTC формат задается moment.defaultFormatUtc.

Календарное форматирование

moment().calendar() форматирует дату относительно сегодняшнего дня:

  • Сегодня 15:20
  • Завтра 15:20
  • Во вторник 15:20

Форматы локализуются и настраиваются для каждой локали.

Комментарии