Манипуляции с датами в JavaScript являются непростой задачей как для новичков, так и для более опытных разработчиков. Библиотека Moment.js позволяет значительно упростить работу JavaScript-программистам.
Moment.js - это проект с открытым исходным кодом, позволяет упростить проверки, синтаксический анализ и обработку дат на стороне клиента. В этом уроке я приведу несколько примеров применения этой полезной JavaScript-библиотеки.
Moment.js избавляет от необходимости использовать родной JavaScript-объект Date напрямую. Библиотека является оболочкой для объекта Date (таким же образом, как jQuery является оболочкой для JavaScript), что позволяет значительно проще работать с объектом.
Проблема объекта Date не функциональность, он чрезвычайно громоздкий при использования разработчиками. Если вы хотите сделать сложный разбор, проверку и отображение даты, вам в конечном итоге придется писать много кода.
Moment.js также расширяет встроенные возможности JavaScript для работы с датами различными функциями, например, относительное время, календарное время, длительность и многоязыковая поддержка. Она также имеет широкий список плагинов, которые выполняют дополнительные функции, такие как поддержка часового пояса, интеграции с Twitter и многие другие.
Для начала вам нужно скачать 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. Чтобы узнать больше о её особенностях, изучите официальную документацию.
Источник© 2008 - 2024 Все права защищены