Подтвердить что ты не робот

Moment.js: дата между датами

Я пытаюсь обнаружить с помощью Moment.js, если заданная дата находится между двумя датами. Начиная с версии 2.0.0, Tim добавил isBefore() и isAfter() для сравнения даты.

Поскольку нет метода isBetween(), я думал, что это сработает:

var date = moment("15/02/2013", "DD/MM/YYYY");
var startDate = moment("12/01/2013", "DD/MM/YYYY");
var endDate = moment("15/01/2013", "DD/MM/YYYY");

if (date.isBefore(endDate) && date.isAfter(startDate) || (date.isSame(startDate) || date.isSame(endDate)) ) { alert("Yay!"); } else { alert("Nay! :("); }

Я убежден, что это лучший способ сделать это. Любые идеи?

4b9b3361

Ответ 1

Вы можете использовать один из плагинов моментаmoment-range, чтобы иметь дело с диапазоном дат:

var startDate = new Date(2013, 1, 12)
  , endDate   = new Date(2013, 1, 15)
  , date  = new Date(2013, 2, 15)
  , range = moment().range(startDate, endDate);

range.contains(date); // false

Ответ 2

В версиях 2.9 + есть функция isBetween, но она эксклюзивная:

var compareDate = moment("15/02/2013", "DD/MM/YYYY");
var startDate   = moment("12/01/2013", "DD/MM/YYYY");
var endDate     = moment("15/01/2013", "DD/MM/YYYY");

// omitting the optional third parameter, 'units'
compareDate.isBetween(startDate, endDate); //false in this case

Существует обходное решение...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

... что логически эквивалентно !(x.isBefore(a) || x.isAfter(b))


В версии 2.13 функция isBetween имеет четвертый необязательный параметр, inclusivity.

Используйте его следующим образом:

target.isBetween(start, finish, 'days', '()') // default exclusive
target.isBetween(start, finish, 'days', '(]') // right inclusive
target.isBetween(start, finish, 'days', '[)') // left inclusive
target.isBetween(start, finish, 'days', '[]') // all inclusive

Больше единиц для рассмотрения: years, months, days, hours, minutes, seconds, milliseconds

Примечание: единицы по-прежнему являются необязательными. Используйте null в качестве третьего аргумента, чтобы игнорировать единицы, и в этом случае миллисекунды являются гранулярностью по умолчанию.

Посетите официальные документы

Ответ 3

Я действительно считаю, что

if (startDate <= date && date <= endDate) {
  alert("Yay");
} else {
  alert("Nay! :("); 
}

работает тоже...

Ответ 4

Вы можете использовать

moment().isSameOrBefore(Moment|String|Number|Date|Array);
moment().isSameOrAfter(Moment|String|Number|Date|Array);

или

moment().isBetween(moment-like, moment-like);

Смотрите здесь: http://momentjs.com/docs/#/query/

Ответ 6

Пожалуйста, используйте 4-й параметр функции moment.isBetween(включенность). Пример:

var startDate = moment("15/02/2013", "DD/MM/YYYY");
var endDate = moment("20/02/2013", "DD/MM/YYYY");

var testDate = moment("15/02/2013", "DD/MM/YYYY");

testDate.isBetween(startDate, endDate, 'days', true); // will return true
testDate.isBetween(startDate, endDate, 'days', false); // will return false

Ответ 7

if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))

логически совпадает с

if (!(date.isBefore(startDate) || date.isAfter(endDate)))

который сохраняет вам пару строк кода и (в некоторых случаях) вызовы методов.

Может быть проще, чем вытягивать весь плагин, если вы хотите сделать это один или два раза.

Ответ 8

Как в документации момента js,

Существует плагин Precise Range, написанный Робом Доусоном, который может быть использован для отображения точных, понятных человеку представлений диапазонов даты/времени, url: http://codebox.org.uk/pages/moment-date-range-plugin

moment("2014-01-01 12:00:00").preciseDiff("2015-03-04 16:05:06");
// 1 year 2 months 3 days 4 hours 5 minutes 6 seconds

moment.preciseDiff("2014-01-01 12:00:00", "2014-04-20 12:00:00");
// 3 months 19 days