Веб-программирование

Работаем с JavaScript-датами используя Moment.js

Манипуляции с датами в JavaScript являются непростой задачей как для новичков, так и для более опытных разработчиков. Библиотека Moment.js позволяет значительно упростить работу JavaScript-программистам.

Работаем с JavaScript-датами используя Moment.js
Поделиться в соцсетях:

Moment.js - это проект с открытым исходным кодом, позволяет упростить проверки, синтаксический анализ и обработку дат на стороне клиента. В этом уроке я приведу несколько примеров применения этой полезной JavaScript-библиотеки.

Что такое Moment.js?

Moment.js избавляет от необходимости использовать родной JavaScript-объект Date напрямую. Библиотека является оболочкой для объекта Date (таким же образом, как jQuery является оболочкой для JavaScript), что позволяет значительно проще работать с объектом.

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

Moment.js также расширяет встроенные возможности JavaScript для работы с датами различными функциями, например, относительное время, календарное время, длительность и многоязыковая поддержка. Она также имеет широкий список плагинов, которые выполняют дополнительные функции, такие как поддержка часового пояса, интеграции с Twitter и многие другие.

Использование Moment.js

Для начала вам нужно скачать Moment.js и подключить его в вашем HTML-документе. Вы также можете найти библиотеку на cdnjs.com (CDN для проектов с открытым кодом). Просто воспользуйтесь поиском в библиотеке, используя термин "moment.js".

После того как мы подключили библиотеку Moment.js, нам нужно убедиться, что она работает правильно, для этого мы собираемся создать экземпляр объекта moment и объект JavaScript Date, а затем выведем их значения на экран.

Ниже показано, как ссылаться на библиотеку Moment.js в ваших HTML-документах, а также как создать экземпляр и отображения значений объекта moment и объекта Date.

<!DOCTYPE html>
<html>
<head>
    <!-- ссылка на Moment.js library -->
    <script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.7.0/moment.min.js" type="text/javascript"></script>
</head>
<body>
    <h2>Moment Date</h2>
    <!-- контейнер для вывода дат при помощи Moment.js -->
    <div id="displayMoment"></div>
    <h2>JavaScript Date</h2>
    <!-- контейнер для вывода дат при помощи JavaScript Date -->
    <div id="displayJsDate"></div>
    <script type="text/javascript">
    (function() {
        // экземпляр объекта moment
        var NowMoment = moment();
        
        // экземпляр объекта JavaScript Date
        var NowDate = new Date();
        
        // вывод значения объекта moment в #displayMoment div
        var eDisplayMoment = document.getElementById('displayMoment');
        eDisplayMoment.innerHTML = NowMoment;
        
        // вывод значения объекта Date в #displayJsDate div
        var eDisplayDate = document.getElementById('displayJsDate');
        eDisplayDate.innerHTML = NowDate;
    })();
</script>
</body>
</html>

На данный момент, объем кода для обоих объектов одинаков.

Форматирование даты

Разница между объектом moment и объектом Date быстро становится очевидной, когда мы хотим вывести даже простую, удобочитаемую дату в формате ‘Y-m-d' (например, '2014-7-1').

Использование JavaScript объекта Date:

// Использование JavaScript объекта <em>Date</em> для текущей даты в div (#displayJsDate)
var NowDate = new Date();
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var sDay = NowDate.getDate();
var sMonth = NowDate.getMonth() + 1;
var sYear = NowDate.getFullYear();
var eDisplayDate = document.getElementById('displayJsDate');
eDisplayDate.innerHTML = sYear+'-'+sMonth+'-'+sDay;

Moment.js делает наш код более компактным.

// use Moment.js to display current date in a div (#displayMoment)
var NowMoment = moment();
var eDisplayMoment = document.getElementById('displayMoment');
eDisplayMoment.innerHTML = NowMoment.format('YYYY-M-D');

Обратите внимание, что при использовании Moment.js нам понадобилось всего лишь вызвать функцию format() и передать ей строку 'YYYY-M-D' в качестве аргумента. Строка определяет формат даты, который нам необходим. Сайт Moment.js имеет множество вариантов формата даты, которые удобно перечислены в виде таблицы здесь: http://momentjs.com/docs/#/displaying/format/

Теперь, когда мы познакомились с процессом отображения и форматирования текущей даты, давайте двигаться дальше.

Парсинг даты

Объект moment принимает строковый параметр и создает объект Date для указанной даты.

<h2>Вывод даты</h2>
<div id="output"></div>

<script type="text/javascript">
(function() {
    var Date = moment('July 1, 2014');
    var eDisplayMoment = document.getElementById('output');
    // вывод даты в нужном формате
    eDisplayMoment.innerHTML = Date.format('YYYY-M-D');
})();
</script>

Одна деталь, которую следует отметить, тут нет стандарта, которого браузеры должны придерживаться при разборе даты. К счастью, библиотека Moment.js предоставляет дополнительные параметры, которые позволяют нам указать точный шаблон, чтобы помочь нам избежать несоответствий.

Для соответствия во всех браузерах и платформах, приведенный выше код должен быть проанализирован как указано ниже.

<h2>Ввод даты</h2>
<div id="input">July 1, 2014</div>

<h2>Вывод даты</h2>
<div id="output"></div>

<script type="text/javascript">
(function() {
// получаем дату из #input div element
var input = document.getElementById('input').innerHTML;

// используем функцию moment() с двумя параметрами: датой и шаблоном
var Date = moment(input, 'MMMM D, YYYY');

//вывод преобразованной даты в div (#output)
var eDisplayMoment = document.getElementById('output');
eDisplayMoment.innerHTML = Date.format('YYYY-M-D');
})();
</script>

На сайте Moment.js есть таблица, содержащая доступные параметры, которые можно использовать для обработки дат: http://momentjs.com/docs/#/parsing/string-format/

Хотя даты редко вводят вручную, важно знать что мы на самом деле обрабатываем значение даты.

Рассмотрим ввод '2014-14-14 '- это невозможная дата. В этом случае функция moment() будет возвращать строку 'Invalid Date' при попытке обработать её.

Однако, есть и другие инструменты доступные нам для обнаружения и исправления недействительных значений даты.

Обнаружение неправильных дат

Для обнаружения неверных дат Moment.js предоставляет нам метод isValid(). Он возвращает простое булево значение (true или false), что позволяет нам определить следующий порядок действий в логике нашего кода, в случае если значение даты не является допустимым.

Другой метод обнаружения невалидных дат - invalidAt(). Этот метод является более специфичным, он скажет нам, где наш дата является невалидной. Он будет возвращать целое число от 0 до 6, значения которых могут быть найдены в следующей таблице.

Число Место ошибки
0 Years
1 Months
2 Days
3 Hours
4 Minutes
5 Seconds
6 Milliseconds

Так, в примере '2014-14-14 ', функция invalidAt() вернет 1, потому что 14 является некорректным значением для месяца (только 1-12 валидные значения).

Исправление неправильных дат

Что делать когда вам необходимо исправить неверную дату? Если вы еще не работали с датами раньше, это может поставить вас в тупик. Однако, Moment.js и здесь нам поможет.

Часто мы просим людей ввести даты и, несмотря на все наши усилия и кричащие всплывающие подсказки с просьбой ввести их в определенном формате, например, "D/M/Y", они игнорируют наши инструкции и вводят "M/D/Y".

Мы можем вернуться к разбору дат, который мы сделали раньше и добавить второй параметр разбора (у вас может их быть больше, чем два варианта), передав в массив строки различных возможных форматов даты в качестве запасного варианта.

Давайте используем дату "1 января 2014" как пример. Мы введем 14/1/2014 и 1/14/2014, а ожидаемый ввод D/M/YYYY.

<h2>Ввод дат</h2>
<div id="input1">14/1/2014</div>
<div id="input2">1/14/2014</div>

<h2>Вывод дат (1 формат)</h2>

<div id="output1"></div>
<div id="output2"></div>

<h2>Вывод (множество форматов)</h2>
<div id="output3"></div>
<div id="output4"></div>

<script type="text/javascript">
(function() {
	var correct = document.getElementById('input1').innerHTML;
	var incorrect = document.getElementById('input2').innerHTML;

	var Date1 = moment(correct, 'D/M/YYYY');
	document.getElementById('output1').innerHTML = Date1.format('MMMM D, YYYY');

	var Date2 = moment(incorrect, 'D/M/YYYY');
	// будет выведено 'Invalid Date' в #output2 потому что формат некорректный
	document.getElementById('output2').innerHTML = Date2.format('MMMM D, YYYY');

	var Date3 = moment(correct, ['D/M/YYYY','M/D/YYYY']);
	document.getElementById('output3').innerHTML = Date3.format('MMMM D, YYYY');

	// попробуем обработать дату используя два потенциально возможных формата
	var Date4 = moment(incorrect, ['D/M/YYYY','M/D/YYYY']);
	// будет выведен правильный формат даты
	document.getElementById('output4').innerHTML = Date4.format('MMMM D, YYYY');
})();
</script>

Вы обратили внимание, что при одном строковом аргументе, если формат не совпадает, вы получите "Invalid Date". Однако, если вы передадите массив форматов в качестве аргумента, то первый вариант, который cработает, будет использоваться.

Сложение и вычитание дат

Одна из моих любимых функций в библиотеке Moment.js - это удобные методы для манипуляции с датами, такие как .add() и .subtract().

Например:

// текущая дата
var Date = moment();

// добавляем 7 дней к текущей дате
document.getElementById('currDatePlus7d').innerHTML = Date.add('days', 7);

// вычитаем 8 часов от текущей даты
document.getElementById('currDateSub8h').innerHTML = Date.subtract('hours', 8);

// добавляем 5 лет и 3 месяца к текущей дате
document.getElementById('currDatePlus8h').innerHTML = Date.add({years: 5, months: 3});

Библиотека Moment.js выполняет подобные операции очень корректно. Например, с помощью нативного JavaScript объекта Date, добавив один месяц к 31 августа мы получим 1 октября. Эта же операция, выполняемая Moment.js, будет правильно возвращать 30 сентября.

Заключение

Moment.js является отличным и полезным инструментом, если вы регулярно работаете с датами на стороне клиента, для обработки, форматирования и проверки дат. Чтобы увидеть исходный код проекта смотрите его репозиторий на GitHub. Чтобы узнать больше о её особенностях, изучите официальную документацию.

Источник
Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям