Вопросы с меткой [momentjs]
Moment.js — лёгкая библиотека для работы с датой и временем в JavaScript.
62 вопроса
Конкурсные
Неотвеченные
- Конкурсные 0
- Неотвеченные
- Цитируемые
- Рейтинг
- Неотвеченные (мои метки)
535 показов
Как высчитывать разницу во времени, учитывая часовые зоны?
Мне нужно сделать таймер обратного отсчета до какого-то события при помощи библиотеки MomentJS. Сервер мне присылает время (назовем его eventTime), до которого должен идти отсчет, я выясняю разницу .
задан 22 июн 2016 в 5:12
1k показов
Как вывести месяц в родительном падеже в momentjs?
Как вывести дату в родительном падеже в momentjs? Например, не сентябрь, а сентября.
задан 22 июл 2017 в 22:18
8k показов
Склонение в moment.js
В momentjs есть такая фича, что можно склонять дни. Например, 1 день, 2 дня, 5 дней. Но вот как это сделать — я без понятия. Обыскался уже в документации. Может знает кто?
задан 27 окт 2016 в 22:32
102 показа
Определить следующие 6 месяцев
Как можно при помощи moment.js определить следующие 6 месяцев? Например, сегодня 12 месяц по счёту и я бы хотел на выходе получить массив: [’12’, ’01’, ’02’, ’03’, ’04’, ’05’]
задан 21 дек 2017 в 17:42
1k показов
Поменять формат даты в momentjs
Задача: Поменять формат даты. Что имеем: Спарсили дату в момент js var data2 = moment(«8 декабря, 2017», «D MMM, YYYY»); Вопрос, как получить дату следующего типа 8.12.2017? Можно конечно .
задан 16 дек 2017 в 9:22
Почему не работает код для работы со временем?
Исполняется сразу а не через 10 минут. var time = moment() var nextTime = time.add(’10’, ‘minute’) if (time == nextTime) < alert('Time to party! ' + time.format()) >Как заставить работать код в .
задан 22 июн 2017 в 16:31
1k показов
Как с помощью diff сравить 2 даты?
Как с помощью метода diff, правильно сравнить 2 даты? var time = moment() var nextTime = time.clone().add(’10’, ‘minute’) if (time == nextTime) < alert('Time to party! ' + time.format()) >.
задан 24 июн 2017 в 14:02
874 показа
moment.js — isValid() возвращает false
var test = moment(«2018-11-14T06:00:00», «DD.MM.YYYY HH:mm»); test.isValid(); // false почему не валидное значение? Что делаю не так?
задан 13 ноя 2018 в 16:36
5k показов
Сконвертировать минуты в часы+минуты при помощи momentjs
Как сконвертировать минуты в часы? Например, у меня есть число 61, что равняется одному часу и одной минуте. Как мне число 61 превратить в ‘1ч. 1м’? Моя конструкция не работает: let time = moment(.
задан 30 мар 2017 в 23:23
11k показов
moment.js вывод даты
Здравствуйте. Использую библиотеку moment.js. Пытаюсь вывести разницу во времени в нужном формате. И вот никак не могу понять как объединить, одно с другим. На данный момент имею: moment.lang(‘ru’); .
задан 30 апр 2016 в 3:09
13k показов
Сравнение дат с применение Moment
Есть две переменные: var last_state_tim_strt = moment(last_state[‘TimStrt’], ‘YYYYMMDDHHmmss’).valueOf(); var current_state_tim_strt = moment(state[‘TimStrt’], ‘YYYYMMDDHHmmss’).valueOf(); Как .
задан 7 ноя 2016 в 12:41
157 показов
Moment format data timeStamp? [закрыт]
Как мне форматировать время в такой формат (10:00). Если я получаю изначально в таком формате (1624996304) ? Нужно (10:00) Есть (1624996304) Заранее спасибо!
задан 30 июн 2021 в 8:54
10k показов
Конвертировать дату в другой формат
Как конвертировать дату в формате YYYY-MM-DD[T]HH:mm:ss.SSS[Z] (например 2017-09-21T21:00:00.000Z) в формат DD.MM.YYYY (например 11.05.2017)? Можно через moment.
задан 20 сен 2017 в 15:32
87 показов
Вставить меняющуюся дату в кнопку
Как в кнопку вместо/рядом со стрелками awesome вставить предыдущую и последующую дату, как на картинке ниже:
задан 15 мар 2021 в 23:07
2k показов
Как в Moment.js вывести список месяцев на русском языке?
Необходимо получить массив, содержащий названия месяцев на русском языке. С помощью библиотеки Moment.js я могу получить массив английских названий месяцев: month = moment.monthsShort() Есть ли .
задан 25 сен 2019 в 7:51
15 30 50 на странице
-
Важное на Мете
Связанные метки
Подписаться на ленту
Лента вопросов с наивысшим рейтингом по меткам [momentjs]
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.21.1314
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Введение в date-fns – облегченная библиотека дат JavaScript
Работа с датами в JavaScript — это боль. Методы родной даты часто бывают многословными и иногда несовместимыми, что также делает их подверженными ошибкам. Но хорошие новости под рукой. Существует несколько библиотек, которые помогают избавиться от устаревших манипуляций. Эти библиотеки относятся к датам JavaScript, а jQuery — к нативному DOM API.
var t = new Date(); alert( new Date(t.getFullYear(), t.getMonth() + 1, 0, 23, 59, 59) );
Смотреть Изучить синтаксис JavaScript и принципы программирования
Включите ваш код JavaScript. Сила современного Интернета.
Конечно, это работает, но не сразу очевидно, что представляют собой числа после getMonth . Теперь сопоставьте это со значительно более читабельным:
const today = new Date(); console.log( lastDayOfMonth(today) );
Этот метод lastDayOfMonth предоставлен date-fns , самопровозглашенным всеобъемлющим набором инструментов для манипулирования датами JavaScript в браузере и Node.js.
В этой статье я собираюсь показать вам, как начать работать с date-fns. После прочтения вы сможете добавить его в свои проекты и использовать многочисленные вспомогательные методы для удобного управления датами. Это сделает код вроде t . getMonth ( ) + 1 , 0 , 23 , 59 , 59 в прошлое.
Так почему бы просто не использовать Moment.js?
Слон в комнате — Момент.js . Эта библиотека, несомненно, стала стандартом де-факто для работы с датами в JavaScript. Так почему бы не использовать это? Зачем нам нужна еще одна библиотека дат JavaScript?
Ну, по словам Саша Косса , создателя date-fns, у Moment.js есть несколько присущих ему проблем, которые побудили его создать date-fns. Саша рассказывает об этих проблемах на странице проекта GitHub , но в двух словах:
- Moment.js является изменяемым, что может вызвать ошибки.
- Он имеет сложный OOP API (который удваивает проблему изменчивости).
- Из-за сложного API это приводит к снижению производительности.
- Его размер сборки велик при использовании с Webpack, так как файлы локали включены в комплект.
Давайте сопоставим это с date-fns (взято с домашней страницы проекта ):
- Date-fns является неизменным, всегда возвращая новую дату, а не изменяя ту, которую вы передаете.
- У него простой API. У вас всегда есть одна функция, которая делает одну вещь.
- Это быстро. Вы можете быть уверены, что ваши пользователи будут иметь лучший пользовательский опыт.
- Это идеальный компаньон для Webpack. Благодаря стилю «функция для файла» вы можете выбрать то, что вам нужно, и прекратить раздутый проект с бесполезной функциональностью.
Для меня особенность, которая заставляет это сиять, является его удобством использования. Используя его в веб-проекте, вы можете просто взять date-fns из CDN, поместить его на свою страницу и получить прибыль. Подробнее об этом дальше …
Установка
Существует множество способов установить библиотеку.
Он доступен в виде пакета npm:
npm install date-fns --save
Или через пряжу:
yarn add date-fns
bower install date-fns
script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.28.5/date_fns.min.js"/>
Если вы выбрали этот метод, обратите внимание, что библиотека находится в пространстве имен под объектом dateFns , так же, как jQuery — в пространстве имен в $ .
script> console.log( dateFns.isToday(new Date()) ); script>
Date-fns Основное использование
Предполагая, что вы используете загрузчик модулей, вам могут потребоваться только те части, которые вам нужны. В следующем примере показано, как форматировать дату .
const format = require('date-fns/format'); console.log( format(new Date(2017, 6, 6), 'MM/DD/YYYY') ); // '06/07/2017'
Хотите изменить язык? Нет проблем:
const format = require('date-fns/format'); const deLocale = require('date-fns/locale/de') // German console.log( format(new Date(2017, 6, 6), 'DD MMMM YYYY', < locale: deLocale >) ); // 06 Juli 2017
Если вы работаете в браузере, не забудьте повесить любые вызовы вспомогательных методов на объекте dateFns . Вот как определить последний день месяца, используя метко названный метод lastDayOfMonth :
script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.28.5/date_fns.min.js">script> script> console.log( dateFns.lastDayOfMonth( new Date(2017, 6, 7) ) ); // Mon Jul 31 2017 00:00:00 GMT+0200 (CEST) script>
Обратите внимание, что у date-fns есть эквивалентные методы для определения последнего дня недели , квартала и года .
Неизменность, Чистота и Простота
Одним из преимуществ продажи date-fns является то, что его функции понятны и просты. Это приводит к легкому для понимания коду, который легче отлаживать, когда что-то идет не так.
Позвольте мне продемонстрировать это, используя Moment.js в качестве контрпримера. Как упоминалось ранее, даты в Moment являются изменяемыми, что может привести к неожиданному поведению.
const moment = require('moment'); const now = new Date(); const mNow = moment(now); mNow.add('day', 3); console.log(mNow.toDate()); mNow.add(3, 'day'); console.log(mNow.toDate()); // 2017-07-08T22:00:00.000Z // 2017-07-11T22:00:00.000Z
Здесь есть пара вещей, на которые стоит обратить внимание. Функция add момента не суетится в том порядке, в котором она принимает свои аргументы (хотя первый метод теперь выдаст предупреждение об устаревании). Но более запутанным является то, что если вы вызываете add несколько раз подряд, вы не получите тот же результат, потому что объекты Moment изменчивы:
mNow.add(3, 'day'); // add 3 days mNow.add(3, 'day'); // adds 3 **more** days
Теперь сравните это с date-fns, который хранит аргументы в одном порядке и всегда возвращает один и тот же результат, возвращая новый объект Date для каждого вызова.
let addDays = required('date-fns/add_days'); addDays(now, 3); // (April 30, 2017) addDays(now, 3); // (April 30, 2017) addDays(now, 3); // (April 30, 2017)
Также обратите внимание на то, как имя метода является более выразительным ( addDays вместо просто add ), сохраняя согласованность и имея один метод для выполнения одной и только одной вещи.
Сравнение дат
Если вы посмотрите список сообщений на канале JavaScript SitePoint, вы увидите, что некоторые из них перечислены как опубликованные в определенный день, тогда как другие перечислены как опубликованные X дней назад. Это может занять некоторое время, если вы попытаетесь реализовать это в обычном JavaScript, но с date-fns это очень просто — просто используйте метод distanceInWords .
Давайте сравним две разные даты.
const distanceInWords = require('date-fns/distanceInWords'); const startDate = new Date(2017, 3, 27); // (April 27, 2017) const endDate = new Date(2018, 3, 27); // (April 27, 2018) console.log( distanceInWords(startDate, endDate) ); // "about 1 year"
В date-fns, если вы хотите узнать разницу в другой единице, вы можете заменить любое из следующего:
Где имена методов имеют differenceIn [ any of the above here ] как differenceInDays .
Работа с коллекциями дат
Date-fns имеет несколько очень удобных вспомогательных методов, которые вы можете использовать для манипуляции коллекциями дат всевозможными способами.
Заказ коллекции дат
В следующем примере используется CompareAsc для сортировки дат по возрастанию. Для этого возвращается 1, если первая дата идет после второй, -1, если первая дата предшествует второй, или 0, если даты равны.
const compareAsc = require('date-fns/compare_asc'); const date1 = new Date('2005-01-01'); const date2 = new Date('2010-01-01'); const date3 = new Date('2015-01-01'); const arr = [date3, date1, date2]; const sortedDates = arr.sort(compareAsc); // [ 2005-01-01, 2010-01-01, 2015-01-01 ]
Как видите, даты теперь в порядке возрастания.
compareAsc методом для compareAsc является CompareDesc .
const compareDesc = require('date-fns/compare_desc'); . const sortedDates = arr.sort(compareDesc); // [ 2015-01-01, 2010-01-01, 2005-01-01 ]
Генерация дней между двумя датами
Чтобы сгенерировать дни между двумя датами, вы можете использовать метод addDays, который мы встречали ранее, а также помощник eachDay, которая возвращает массив дат в указанном диапазоне.
const addDays = require('date-fns/add_days'); const eachDay = require('date-fns/each_day'); const today = new Date(); const dayAWeekFromNow = addDays(today, 7); const thisWeek = eachDay(today, dayAWeekFromNow); console.log(thisWeek); // [ 2017-07-03, 2017-07-04, 2017-07-05, 2017-07-06, 2017-07-07, 2017-07-08, 2017-07-09, 2017-07-10 ]
Нахождение ближайшей даты
Найти ближайшую дату к определенной дате в массиве дат можно с помощью метода closestTo . Этот фрагмент кода следует из предыдущего примера:
const closestTo = require('date-fns/closest_to'); . const christmas = new Date(2017, 11, 25); const closestToChristmasDate = closestTo(christmas, thisWeek); // 2017-07-10T
Существует также метод closestIndexTo, если вы хотите вместо этого получить индекс массива.
Часовые пояса
Недостатком date-fns является то, что в настоящее время у него нет вспомогательных функций часового пояса, как у Moment.js. Этот ответ о переполнении стека на самом деле дает некоторое представление о том, как собственные объекты Date самом деле не хранят данные «реального часового пояса». Однако date-fns всегда возвращает местный часовой пояс, в котором выполняется код.
В этой теме вы заметите, что они упоминают несколько ограниченный способ установки часовых поясов в JavaScript. Как отмечается в ответе, это не всеобъемлющее решение, но оно работает для многих сценариев, которые требуют только преобразования выходных данных (из UTC или местного времени в определенный часовой пояс).
new Date().toLocaleString("en-US", timeZone: "America/New_York">);
В действительности, часовые пояса — это сложная проблема, поэтому MomentJS имеет для этого отдельную библиотеку. Есть также планы добавить поддержку часовых поясов для date-fns , но на момент написания, это все еще в стадии разработки.
Вывод
Date-fns — отличная небольшая библиотека, которая предлагает вам целый ряд вспомогательных методов для работы с датами в JavaScript. Я надеюсь, что эта статья дала вам достаточно понимания и вдохновения, чтобы проверить и начать использовать ее в своих собственных проектах. Библиотека находится в стадии активной разработки, и версия 2 (надеюсь) не за горами.
После этого я оставлю вас в вашем путешествии, чтобы начать работу с date-fns, пожалуйста, дайте мне знать, как ваш опыт работы с date-fns в комментариях ниже.
Разница в датах?
Здравствуйте. Недавно я впал в ступор и не смог получить разницу во времени в виде ГОДА — МЕСЯЦА — ДНИ — ЧАСЫ — МИНУТЫ — СЕКУНДЫ.
На входе у нас есть дата (date). Нам нужно сравнить с текущим временем и вывести разницу. Извиняюсь за непонятное объяснение, голова уже не варит.
- Вопрос задан более трёх лет назад
- 15205 просмотров
Комментировать
Решения вопроса 1

JavaScript developer. IonDen.com
Moment.js — отличная библиотека для работы со временем. Помимо всего прочего умеет делать всевозможные сравнения дат между собой. Попробуйте, возможно это то что вам нужно. Кроме того сможет вывести разницу в любом заданном вами формате. В том числе и на любом языке.
Ответ написан более трёх лет назад
Нравится 4 3 комментария
Александр Вульф @mannaro Автор вопроса, куратор тега JavaScript
Кажется это именно то, что я искал. Спасибо.
Александр Вульф @mannaro Автор вопроса, куратор тега JavaScript
Единственное, что он считает, что дней в месяце — 30. А это не есть гуд.

Я использовал moment.js в своем плагине. Он совершенно правильно определяет кол-во дней в месяце.
Ответы на вопрос 4
noonesshadow @noonesshadow
обе даты (дата на входе и текущая дата) должны быть заданы в одном и том же часовом поясе
между двумя датами могли переводить время, тогда, возможно, нужно прибавить или отнять 1 час
года бывают високосные и нет
если примерное значение устроит, то разница двух объектов Date — число миллисекунд между ними
делением
на 1000 — секунды
на 60000 — минуты
на 3600000 — часы
на 86400000 — сутки
на 31536000000 — годы
Ответ написан более трёх лет назад
Нравится 2 2 комментария
Александр Вульф @mannaro Автор вопроса, куратор тега JavaScript
Это было моей первой идеей. Но вот геморрой с количеством дней в месяце побудил меня обратиться на хабр.
т.е. если у нас разница в 10 лет, то приблизительное значение будет меньше на 60 (!) дней, а это 2 месяца.
noonesshadow @noonesshadow
Оказывается, тут ограничения не действуют.
Один из самых умных скриптов математики дат в js.
Именно так, «ГОДА — ЧАСЫ — МИНУТЫ — СЕКУНДЫ»? Дни, месяцы не нужны?
1) получаем разницу дат в секундах
2) делим на 60: результат — разница в минутах, остаток — секунды
3) делим на 60: результат — разница в часах, остаток — минуты
4) делим на 24: результат — разница в днях, остаток — часы
5)… тут нужно правильно посчитать годы (с учётом високосных и кратных 100 и 400), получим разницу в годах, в остатке — дни
6) RPOFIT
Если ещё и месяцы нужны, то будет заметно сложнее.
Luxon — новая библиотека для работы с датами от команды Moment.js

Казалось бы, зачем нужна еще одна библиотека для работы с датами и временем когда есть всем известная библиотека Moment?! Тем интереснее, что альтернатива предложена самой командой Moment.
Библиотека Luxon заявлена как мощное, современное и удобное средство для работы с датами и временем в JavaScript. Библиотеку создал Айзек Камброн (Isaac Cambron), входящий в команду разработчиков Moment с 2013 года.
У автора было много идей по развитию Moment, которые он не мог сделать в рамках существующего кода. Вот основные моменты, которые хотелось реализовать:
- опробовать некоторые идеи как сделать API более логичным (но эти идеи были не совместимы с подходом, принятым в Moment),
- реализовать «из коробки» работу с временными зонами без дополнительных расширений,
- полностью переосмыслить работу с интернационализацией с учетом появления Intl API,
- перейти на современный набор инструментов и подходов при формирования JS кода.
Принципы Luxon
- Цепочки вызовов как в Moment.
- Все типы иммутабельными.
- Более ясный и очевидный API: для разных объектов — разные методы с четко определенными параметрами.
- Intl API для обеспечения интернационализации (откат к английскому варианту, если браузер не поддерживает Intl API).
- Intl API для обеспечения работы с временными зонами.
- Более полная поддержка расчета длительности.
- Встроенная поддержка работы с интервалами.
- Инлайн документация кода.
- Код Luxon намного проще в понимании и отладке.
- Использование встроенных возможностей браузера для интернационализации улучшает поведение библиотеки и, опять же, облегчает отладку.
- Поддержка временных зон реализована лучше чем в любой другой JS библиотеке.
- Luxon предоставляет одновременно простой и очень мощный инструмент для работы с длительностью.
- У библиотеки хорошая документация.
- Упор на использование встроенных возможностей браузера приводит к сложностям в поддержке старых браузеров.
- Некоторые возможности интернационализации, которые еще не поддерживаются браузерами не реализованы и в библиотеке (необходимо ожидать, когда в браузерах такая поддержка появится).
- Реализация Intl API в разных браузерах может различаться, соответственно, будет различаться и поведение Luxon.
Установка
Luxon предоставляет модули под все современные платформы JavaScript.
В документации есть полный список поддерживаемых браузеров с указанием ограничений применения. Для браузеров у которых отсутствует или ограничена поддержка Intl рекомендуется использовать полифил (в частности это касается IE 10 или 11).
При работе с Node.js (6+), если нужна работа с локалями, то потребуется дополнительно установить пакет full-icu и задать переменную окружения, чтобы включить использование этого пакета.
Стандартный способ установки из npm:
npm install —save luxon
У Luxon есть поддержка как TypeScript так и Flow, так же есть модуль в формате ES6.
Быстрый обзор
Библиотека Luxon состоит из пяти основных классов:
DateTime — дата и время с часовым поясом и настройками отображения, а так же сопутствующие методы.
Duration — период времени (длительность), например, «2 месяца» или «1 день, 3 часа».
Info — статические методы для получения общих данных о времени и дате.
Interval — интервал времени и методы для работы с ним.
Settings — статические методы, которые задают общее поведение Luxon.
import from 'luxon';
Ваш первый DateTime
Самый важный класс в Luxon — DateTime. DateTime представляет дату+время вместе с часовым поясом и локалью. Вот так можно задать 15 мая 2017 года 08:30 в локальном часовом поясе:
var dt = DateTime.local(2017, 5, 15, 8, 30);
Вот вызов для определения текущего времени:
var now = DateTime.local();
Создание из объекта
DateTime.fromObject(< month:12, day: 22, hour: 12, minutes: 20, zone: 'Europe/Kaliningrad' >); //=> 2018-12-22T12:20:00.000+02:00
Создание из строки в формате ISO 8601
DateTime.fromISO("2017-05-15"); //=> May 15, 2017 at 0:00 DateTime.fromISO("2017-05-15T08:30:00"); //=> May 15, 2017 at 8:30
При преобразовании в строку Luxon так же возвращает строку в формате ISO 8601:
DateTime.local().toString(); //=> "2018-12-18T20:58:29.995+03:00"
Получение отдельных компонентов:
var dt = DateTime.local(); dt.year; //=> 2018 dt.month; //=> 12 dt.day; //=> 18 dt.second; //=> 27 dt.weekday; //=> 2 dt.zoneName; //=> "Europe/Moscow" dt.offset; //=> 180 dt.daysInMonth; //=> 31
Вывод в форматированном виде
Luxon имеет множество методов для преобразования DateTime в строку, два из них наиболее важны toLocaleString и toISO, первый преобразует в формат с учетом лакали браузера, а второй готовит текст для программной обработки (к примеру, для передачи на сервер):
dt.toLocaleString(); //=> "18.12.2018" dt.toLocaleString(DateTime.DATETIME_MED); //=> "18 дек. 2018 г., 21:46" dt.toISO(); //=> "2018-12-18T21:46:55.013+03:00"
Для форматированного вывода в Luxon есть два десятка готовых «пресетов» (таких как DATETIME_MED и TIME_WITH_LONG_OFFSET).
Так же можно сформировать собственный вариант форматирования на основе токенов:
dt.setLocale('ru').toFormat('d MMMM tt - ZZZZZ'); //=> "18 декабря 21:46:55 - Москва, стандартное время"
Преобразования DateTime
Важное замечание: объекты Luxon — иммутабельны, т.е. любые изменяющие методы примененные к ним возвращают измененную копию не изменяя исходного объекта. Поэтому все термины в этой статье (как и в документации Luxon) такие как «изменить», «установить», «переопределить» надо понимать как «создать новый экземпляр с другими свойствами».
Математические преобразования
var dt = DateTime.local(2018, 12, 18, 20, 30); //=> "18.12.2018, 20:30" dt.plus(); //=> "18.12.2018, 23:32" dt.minus(); //=> "11.12.2018, 20:30" dt.startOf('day'); //=> "18.12.2018, 0:00" dt.endOf('hour'); //=> "18.12.2018, 20:00"
Переопределение отдельных параметров
var dt = DateTime.local(); dt.set().hour //=> 3
Преобразования Intl
Luxon поддерживает несколько разных преобразований Intl, одним из наиболее важных является форматирование под различные локали:
var dt = DateTime.local(); var f = ; dt.setLocale('fr').toLocaleString(f); //=> "18 décembre" dt.setLocale('en-GB').toLocaleString(f); //=> "18 December" dt.setLocale('en-US').toLocaleString(f); //=> "December 18"
Класс Info может возвращать списки месяцев и дней недели в заданной локали:
Info.months('long', ); //=> ["gennaio", "febbraio", "marzo", . ] Info.weekdays ('short', ); //=> ["Mo", "Di", "Mi", . ]
Часовые пояса
Luxon поддерживает часовые пояса. Если создавать DateTime без явного указания временной зоны, то по умолчанию будет выбрана локальная зона. Если у существующего DateTime изменить зону, то время и дата будут пересчитаны с учетом разницы между часовыми поясами.
var dt = DateTime.local(2018, 12, 18, 20, 00); //=> 2018-12-18T20:00:00.000+03:00 dt.zone.name; //=> "Europe/Moscow" dt.setZone('Asia/Vladivostok'); //=> 2018-12-19T03:00:00.000+10:00
Luxon также поддерживает работу с датой и временем в формате UTC:
DateTime.utc(2018, 5, 15); //=> 2018-05-15T00:00:00.000Z DateTime.utc(); //=> 2018-12-18T17:58:29.995Z DateTime.local().toUTC(); //=> 2018-12-18T17:58:29.995Z DateTime.utc().toLocal(); //=> 2018-12-18T20:58:29.995+03:00
Длительность
Класс Duration предоставляет возможность работать с длительностью, например, «2 часа и 7 минут». Создать длительность можно так:
var dur = Duration.fromObject();
Длительности могут складываться и вычитаться. Длительность может иметь отрицательное значение.
dur.minus(dur).minus(dur); //=>
Подобным образом длительность может быть добавлена или вычтена из DateTime.
DateTime.local().plus(dur);
У длительности есть геттеры (похожие на геттеры DateTime):
dur.hours; //=> 2 dur.minutes; //=> 7 dur.seconds; //=> 0 dur.zone; //=> undefined
Так же у длительности есть и другие полезные методы:
dur.as('seconds'); //=> 7620 dur.toObject(); //=> < hours: 2, minutes: 7 >dur.toISO(); //=> 'PT2H7M'
Интервалы
Интервалы задаются как период между двумя временными точками, для работы с ними используется класс Interval. Время начала входит в интервал, а время окончания — нет: соответственно, начало при преобразовании в строку отмечается квадратной скобкой, а конец — круглой.
var today = DateTime.local(2018, 12, 18); var later = DateTime.local(2020, 10, 12); var interval = Interval.fromDateTimes(today, later); interval.toString(); //=> "[2018-12-18T00:00:00.000+03:00 – 2020-10-12T00:00:00.000+03:00)" interval.toISO(); //=> "2018-12-18T00:00:00.000+03:00/2020-10-12T00:00:00.000+03:00" interval.length(); //=> 57369600000 interval.length('years', true); //=> 1.8169398907103824 interval.contains(DateTime.local(2019)); //=> true
Интервалы можно сравнивать между собой и комбинировать друг с другом:
var nextYear = Interval.after(DateTime.local(), ); var prevYear = Interval.before(DateTime.local(), ); prevYear.overlaps(nextYear); //false prevYear.abutsStart(nextYear); //true nextYear.union(prevYear).length('years'); //=> 2
Luxon и Moment
Библиотека Luxon «обитает» в проекте «Moment», но не является полной заменой библиотеки Moment. Luxon не предоставляет полной функциональности Moment, к примеру, относительное форматирование дат только совсем недавно было реализовано в браузере Chrome версии 71, в других браузерах пока не работает и в Luxon поддержка для него еще не реализована (хотя и ожидается). Но даже если браузеры поддерживают требуемый функционал, то надо понимать, что он будет доступен только в этих новых средах. В устаревших браузерах Luxon будет работать с проблемами, в то время как Moment работает всегда и везде.
Кроме этого API Luxon был полностью переработан и он совершенно не совпадает с API Moment.
Отметим главные различия между Moment и Luxon.
Иммутабельность
Объекты Luxon иммутабельны, а у Moment — нет.
В приведенном ниже примере m1 и m2 — это один и тот же объект, который был изменен методом add.
var m1 = moment(); var m2 = m1.add(1, 'hours'); m1 === m2; //=> true
В случае Luxon метод plus возвращает новый объект d2 не изменяя исходный d1.
var d1 = DateTime.local(); var d2 = d1.plus(< hours: 1 >); d1 === d2; //=> false d1.valueOf() === d2.valueOf(); //=> false
По этой причине Luxon не требует специальных конструкторов для копирования и методов для клонирования, которые используются Moment для получения копий без изменения исходного значения.
Основные функциональные различия
- Отсчет месяцев в Luxon начинается с 1, а не с нуля как в Moment (и нативноv js-объекте Date).
- Локализация и временные зоны реализованы с помощью нативного Intl API (или полифила), а не встроены в библиотеку.
- Luxon имеет встроенные типы Duration и Interval.
- Luxon пока не поддерживает относительное форматирование дат.
- В Luxon так же пока нет метода humanize для представления длительности в «очеловеченном» стиле (к примеру, «a few seconds»).
Различия в стиле API
- В методах API Luxon опционные параметры обычно располагаются последними.
- Luxon имеет множество отдельных методов для создания объектов(например, fromISO), в отличие от Moment, который имеет для этого одну функцию, а тип объекта задается параметрами.
- У Luxon очень строгие парсеры, в то время как у Moment они более либеральные, т.е. если формат входной строки будет отличаться от стандартного, то Luxon сразу выдаст ошибку, а Moment какие-то ошибки в формате попробует исправить.
- Для получения значения внутренних полей Luxon использует геттеры (dt.year, dt.isValid), а не методы как Moment (m.year(), m.isValid()).
- Luxon позволяет одним методом сразу установить все необходимые параметры dt.set(), в Moment они задаются только по одному — цепочкой вызовов m.year(2016).month(4).
- Длительность в Luxon — это отдельный класс верхнего уровня Duration.
Размеры файлов библиотек
Luxon (v. 1.8.2)
luxon.min.js — 61 KB
Moment (v. 2.23.0)
moment.min.js — 51 KB
moment.min.js + locale/ru.js — 59 KB
moment-with-locales.min.js — 323 KB
Как видим, без локалей Moment по размеру на 10 KB меньше чем Luxon, но с добавлением нескольких локалей размер становится примерно равным.
Если же требуется поддержка сразу всех локалей, то тут существенный выигрыш у Luxon.
Резюме
Библиотека полностью готова к использованию и автор обещает ее поддержку. У библиотеки уже 7k+ звезд на гитхабе и популярность ее только растет. В ее код делает коммиты не только сам автор, но еще не менее 6 разработчиков.
Предположу, что библиотека Luxon это ответ на появление в браузерах поддержки Intl API. Разработчики Moment понимают, что работа с датами на вебе может существенно измениться и пытаются подготовиться к этим изменениям. Но точно предсказать развитие веба, а вместе с ним и нового проекта (который сами называют Moment labs project) они не могут. Будут ли идеи Luxon перенесены в Moment 3? Перейдет ли в какой то момент большинство пользователей с Moment на Luxon? Может быть Luxon будет переименован в Moment? Сами разработчики признаются, что не могут сейчас ответить на эти вопросы.
- Веб-разработка
- JavaScript
