Изготовление сайтов в Москве, МСК. Управление датами и временем с помощью Moment.js

 
 

Работа с датами и временем в JavaScript всегда была немного громоздкой. Собственные методы дат многословны, а API часто непоследовательны. Вот почему, если вы зададите вопрос о дате на StackOverflow, вы часто услышите ответ «Используйте Moment.js».

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

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

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

Предупреждение для новых пользователей: вместо этого используйте date-fns

Обратите внимание, что с сентября 2020 года мы рекомендуем пользователям, желающим внедрить библиотеку дат, использовать вместо нее date-fns.

Moment.js — довольно тяжелая библиотека для своих функций, и инструменты разработчика Chrome теперь активно рекомендуют не использовать ее в рамках тестирования производительности Core Web Vitals. В результате проект находится в режиме обслуживания, и, по словам сопровождающих Moment.js, разработка новых функций больше не ведется.

➤ Изучите date-fns: легкая библиотека дат JavaScript

Начало работы с Moment.js

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

npm install moment

Затем просто require () используйте его в своем приложении, как показано ниже.

const moment = require ('moment’) ;

const today = moment () ;

console.log (today.format ());

// 2020-01-09T15:45:51+01:00

Чтобы запустить Moment.js из браузера, включите его с помощью

Moment.js

 

 

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

Я помню, как раньше преобразовывал строки даты в Dateобъекты, извлекал отдельные фрагменты данных, а затем выполнял конкатенацию строк. Moment.js упростил процесс преобразования даты в любой конкретный формат. Преобразование формата даты с помощью Moment выполняется просто, как показано в следующем примере.

moment ().format ('YYYY-MM-DD’) ;

Вызов moment () дает нам текущую дату и время, при этом format () преобразует его в указанный формат. В этом примере дата форматируется как год из четырех цифр, за которым следует дефис, затем месяц из двух цифр, еще один дефис и день из двух цифр.

Совет: Попробуйте поэкспериментировать с некоторыми другими форматами даты, перечисленными в документации проекта.

Проверка даты

Еще одна раздражающая задача, которую Moment.js значительно упростил, — это проверка даты. Чтобы выполнить проверку, просто передайте momentобъекту строку даты вместе с желаемым форматом даты и вызовите isValid () метод. Это вернется true, если дата действительна, и в falseпротивном случае.

console.log (moment («2020-01-01», «YYYY-MM-DD»).isValid ()); // true

console.log (moment («not-a-date», «YYYY-MM-DD»).isValid ()); // false

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

console.log (

moment («2019 was a great year because I got married», «YYYY-MM-DD»).isValid ()

) ;

// Returns true because 2019 matches YYYY

Чтобы избежать этого, вы можете перевести Moment в режим строгого разбора, передав его trueв качестве третьего аргумента.

console.log (

moment («2019 was a great year because I got married», «YYYY-MM-DD», true).isValid ()

) ;

// false

Вот пример, демонстрирующий эту функциональность.

В объекте, возвращаемом функцией, есть ряд других полезных флагов moment ():

переполнение — устанавливается, когда происходит переполнение. Примером может служить 13-й месяц или 32-й день.

invalidMonth — установите, если месяц недействителен, например Jannuaarry.

пустой — устанавливается, когда введенная дата не содержит ничего поддающегося анализу.

nullInput — устанавливается, когда введенная дата равна null.

Подробнее об этих и других доступных флагах можно прочитать на домашней странице проекта.

Манипулирование датами

Существует несколько вариантов манипулирования momentобъектом. Например, вы можете добавлять или вычитать дни, месяцы, годы и т. д. Это достигается с помощью методов add () и subtract (). В следующем примере показано, как к текущей дате добавляются семь дней, месяцев или недель.

moment ().add (7, 'days’) ; // adds 7 days to current date

moment ().add (7, 'months’) ; // adds 7 months to current date

moment ().add (7, 'years’) ; // adds 7 years to current date

Точно так же subtract () метод показан ниже.

moment ().subtract (7, 'days’) ; // subtracts 7 days to current date

moment ().subtract (7, 'months’) ; // subtracts 7 months to current date

moment ().subtract (7, 'years’) ; // subtracts 7 years to current date

Обратите внимание, что каждый из приведенных выше примеров возвращает momentобъект. Если вам нужна удобочитаемая дата, вам нужно отформатировать ее соответствующим образом.

const today = moment () ;

const nextWeek = today.add (7, 'days’) ;

console.log (nextWeek.format ('dddd Do MMMM, YYYY’));

// Thursday 16th January, 2020

Время с этого момента

Другая распространенная задача — определить, сколько времени проходит между двумя датами. Для расчета времени от текущей даты Moment.js использует метод fromNow (). Вот как можно проверить, сколько времени прошло с начала декады:

moment ('2020.01.01', 'YYYY.MM.DD’).fromNow () ;

// 9 days ago

Если мы передаем в trueкачестве аргумента, мы можем получить значение без суффикса.

moment ('2020.01.01', 'YYYY.MM.DD’).fromNow (true) ;

// 9 days

Время от другой даты

Метод fromNow () используется для сравнения времени с текущей датой. Это всего лишь частный случай from (), который сравнивает две произвольные даты. Пример использования from () показан ниже.

const dateA = moment ('01-01-1900', 'DD-MM-YYYY’) ;

const dateB = moment ('01-01-2000', 'DD-MM-YYYY’) ;

console.log (dateA.from (dateB));

Вы можете поиграть с этим методом в следующей демонстрации.

Вычисление разницы между датами

Moment.js предлагает способ расчета разницы между двумя датами. По умолчанию разница рассчитывается в миллисекундах, но также может быть возвращена в днях, месяцах, годах и т. д. Чтобы вычислить разницу, вызовите метод diff (). Этот метод принимает дату в качестве первого аргумента. Единицу времени можно указать с помощью необязательного второго аргумента. Если это не включено, то используются миллисекунды. Следующий пример и демонстрация иллюстрируют, как diff () используется.

const dateB = moment ('2014-11-11') ;

const dateC = moment ('2014-10-11') ;

console.log ('Difference is ', dateB.diff (dateC), 'milliseconds’) ;

console.log ('Difference is ', dateB.diff (dateC, 'days’), 'days’) ;

console.log ('Difference is ', dateB.diff (dateC, 'months’), 'months’) ;

Запросы даты

Moment.js также предоставляет различные методы сравнения дат. Эти методы включают isBefore (), isAfter () и, isSame () которые, как следует из названия, возвращают логическое значение, указывающее, является ли одна дата до, после или равной другой дате. Пример использования isAfter () показан ниже.

console.log (moment ('2020-01-01').isAfter ('2019-01-01')); // true

console.log (moment ('2020-01-01').isAfter ('2020-01-08')); // false

Существует также метод isLeapYear (), который проверяет високосные годы.

console.log (moment ([2020]).isLeapYear ()); // true

console.log (moment ([2019]).isLeapYear ()); // false

Международная языковая поддержка

Moment.js предлагает отличную поддержку i18n. Он позволяет назначить глобальный язык или установить язык для конкретного momentобъекта. По умолчанию он поддерживает английский язык. Если вы хотите поддерживать любой другой язык, назначьте значения ключей этого конкретного языка для moment.locale. В следующем сокращенном примере, взятом из документации Moment.js, показано, как можно добавить поддержку французского языка.

const moment = require ('moment’) ;

moment.locale ('fr’, {

months: 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre’.split ('_'),

weekdays: 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi’.split ('_'),

relativeTime: {

future: 'dans%s’,

past: 'il y a%s’,

s: 'quelques secondes’,

m: 'une minute’,

mm: '%d minutes’,

h: 'une heure’,

hh: '%d heures’,

d: 'un jour’,

dd: '%d jours’,

M: 'un mois’,

MM: '%d mois’,

y: 'un an’,

yy: '%d ans’

}

}) ;

moment.locale ('fr’) ;

console.log (moment (1316116057189).fromNow ());

// il y a une heure

console.log (moment ().format ('dddd Do MMMM, YYYY’));

// jeudi 9e janvier, 2020

Почему момент может не подойти

Хотя Moment.js — отличная библиотека времени и даты, она также является чем-то вроде бегемота. Например, если вы используете его с веб-пакетом, достаточно просто невинности, require ('moment’) ;чтобы гарантировать, что все локали будут работать вместе. Это значительно увеличивает размер вашего пакета, и вам нужно прибегнуть к плагинам, чтобы уменьшить его.

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

Другая распространенная жалоба заключается в том, что momentобъект изменчив. Это может привести к путанице среди разработчиков. Рассмотреть возможность:

const moment = require ('moment’) ;

const today = moment () ;

const nextWeek = today.add (7, 'days’) ;

console.log (today.fromNow ());

Что вы ожидаете от входа в консоль? К сожалению, ответ «через 7 дней» (а не «несколько секунд назад»), потому что код today.add (7, 'days’) мутировал momentобъект, установив его на семь дней в будущем.

Этого можно избежать, клонировав momentобъект перед выполнением каких-либо математических операций с датами, но к тому времени, когда вы помните об этом, скорее всего, вы уже потратили довольно много времени на отладку.

const moment = require ('moment’) ;

const today = moment () ;

const nextWeek = today.clone ().add (7, 'days’) ;

console.log (today.fromNow ());

// a few seconds ago

Легкая альтернатива

Для тех из вас, кто ищет более легкую альтернативу, рассмотрите date-fns. Date-fns неизменяем, всегда возвращает новую дату, а не изменяет ту, которую вы вводите. Он имеет простой API, является идеальным компаньоном для Webpack, а с его стилем функций для каждого файла вы можете выбрать именно то, что вам нужно.

Если вы хотите узнать больше, прочитайте: Введение в date-fns — облегченную библиотеку дат JavaScript.

Вывод

Moment.js — действительно замечательная библиотека, которая упрощает манипуляции и проверки, связанные с датой и временем. В этой статье мы сосредоточились на некоторых функциях Moment.js, которые помогают анализировать, проверять и манипулировать датами и временем в браузере и приложениях Node.js. Для Moment.js также доступен ряд полезных плагинов. Плагины, такие как Календарь ISO, Календарь Джалаали и многие другие, можно найти на официальной странице плагинов. Чтобы узнать больше о Moment.js, читатель может обратиться к документации библиотеки.

3D-печать5GABC-анализAndroidAppleAppStoreAsusCall-центрChatGPTCRMDellDNSDrupalExcelFacebookFMCGGoogleHuaweiInstagramiPhoneLinkedInLinuxMagentoMicrosoftNvidiaOpenCartPlayStationPOS материалPPC-специалистRuTubeSamsungSEO-услугиSMMSnapchatSonyStarlinkTikTokTwitterUbuntuUp-saleViasatVPNWhatsAppWindowsWordPressXiaomiYouTubeZoomАвдеевкаАктивные продажиАкцияАлександровск ЛНРАлмазнаяАлчевскАмвросиевкаАнализ конкурентовАнализ продажАнтимерчандайзингАнтрацитАртемовскАртемовск ЛНРАссортиментная политикаБелгородБелицкоеБелозерскоеБердянскБизнес-идеи (стартапы)БрендБрянкаБукингВахрушевоВендорВидеоВикипедияВирусная рекламаВирусный маркетингВладивостокВнутренние продажиВнутренний маркетингВолгоградВолновахаВоронежГорловкаГорнякГорскоеДебальцевоДебиторкаДебиторская задолженностьДезинтермедитацияДзержинскДивизионная система управленияДизайнДимитровДирект-маркетингДисконтДистрибьюторДистрибьюцияДобропольеДокучаевскДоменДружковкаЕкатеринбургЕнакиевоЖдановкаЗапорожьеЗимогорьеЗолотоеЗоринскЗугрэсИжевскИловайскИрминоКазаньКалининградКировскКировскоеКомсомольскоеКонстантиновкаКонтент-маркетингКонтент-планКопирайтингКраматорскКрасноармейскКрасногоровкаКраснодарКраснодонКраснопартизанскКрасный ЛиманКрасный ЛучКременнаяКураховоКурскЛисичанскЛуганскЛутугиноМакеевкаМариупольМаркетингМаркетинговая информацияМаркетинговые исследованияМаркетинговый каналМаркетинг услугМаркетологМарьинкаМедиаМелекиноМелитопольМенеджментМерчандайзерМерчандайзингМиусинскМолодогвардейскМоскваМоспиноНижний НовгородНиколаевНиколаевкаНишевой маркетингНовоазовскНовогродовкаНоводружескНовосибирскНумерическая дистрибьюцияОдессаОмскОтдел маркетингаПартизанский маркетингПервомайскПеревальскПетровскоеПлата за кликПоисковая оптимизацияПопаснаяПравило ПаретоПривольеПрогнозирование продажПродвижение сайтов в ДонецкеПроизводство видеоПромоПромоушнПрямой маркетингРабота для маркетологаРабота для студентаРазработка приложенийРаспродажаРегиональные продажиРекламаРеклама на асфальтеРемаркетингРетро-бонусРибейтРитейлРовенькиРодинскоеРостов-на-ДонуРубежноеСамараСанкт-ПетербургСаратовСватовоСвердловскСветлодарскСвятогорскСевастопольСеверодонецкСеверскСедовоСейлз промоушнСелидовоСимферопольСинергияСколковоСлавянскСнежноеСоздание сайтов в ДонецкеСоледарСоциальные сетиСочиСтаробельскСтаробешевоСтахановСтимулирование сбытаСуходольскСчастьеТелемаркетингТельмановоТираспольТорговый представительТорезТрейд маркетингТрейд промоушнТюменьУглегорскУгледарУкраинскХабаровскХарцызскХерсонХостингЦелевая аудиторияЦифровой маркетингЧасов ЯрЧелябинскШахтерскЮжно-СахалинскЮнокоммунаровскЯндексЯсиноватая