Moment.js: дата між датами


118

Я намагаюся виявити за допомогою Moment.js, якщо вказана дата знаходиться між двома датами. Починаючи з версії 2.0.0, Тим додав 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! :("); }

Я переконаний, що для цього має бути кращий спосіб. Будь-які ідеї?


Я впевнений, що ти захотів ? isBetween || isStart || isEnd
— Бергі

Ага, друкарня там, вибачте!
— Джоел А. Вільярреаль Бертольді

Відповіді:


82

Ви можете використовувати один із модулів моменту -> момент, щоб вирішити діапазон дат:

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

1
як ви включаєте плагін?

2
Вам слід просто включити <script src = "/ javascripts / moment-range.js"> </script> після momentjs
— Лукаш Козіара

53
date.isBet between (startDate, endDate); набагато простіше і уникає необхідності додаткового плагіна.
— Брендан Ні Ні

момент-момент-діапазон надає опції для форматування часу дати під час підготовки діапазонів, а потім порівняння дат для "Містить" / "В межах" / "Перекриття" / "Пересікається" / "Додати / віднімати". якщо якісь одні дати пошуку в якомусь спеціальному форматі, тоді можна підготувати діапазони дат у масиві, перетворивши ці дати в потрібний формат, і тоді ми можемо порівняти.
— Саджад Алі Хан

277

У версіях 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.13isBetween функція має четвертий необов'язковий параметр, 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
майте на увазі, що, як зазначено в документах, "Між собою є ексклюзивним"
— Хоакін Л.

x.isBetween(moment(a).subtract(1, 'day'), b)здається, теж робить свою справу.
— Джеймс Доннеллі

@ThisClark Це хороший спосіб вирішення; я можу запропонувати ще один із меншими викликами функцій:!(x.isBefore(a) || x.isAfter(b))
— tavnab

Що exclusiveозначає?
— Бетмен

2
@Batman Розгляньте список 1,2,3,4,5. Виключно 1 і 5 не знаходяться між значеннями цього списку. Включно 1 і 5 знаходяться між значеннями цього списку. Зліва включно (те саме, що справа виключно) включає 1, але не 5. Право включно (те саме, що ліворуч виключно) включає 5, але не 1.
— ThisClark


16

Я в це вірю

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

також працює ...


Цей розрахунок завжди ігнорує рік. Наприклад, якщо я даю startDate = '05 -01-2019 ', endDate = '05 -31-2019' та дату як '05 -21-2017 ', це дасть мені результат як "Yay", хоча це помилково .
— Аакаш Маурія

1
@AakashMaurya Ви порівнюєте рядки, а не дати. Переконайтеся, що ви визначили свій startDate / endDate як startDate = нова дата ("05-01-2019").
— Tiele Declercq

13

Гарні новини всім, є isBetweenфункція! Оновіть свою бібліотеку;)

http://momentjs.com/docs/#/query/is-between/


2
Правда, але isBetweenне включено
— Epoc

4
Версія 2.13.0 вводить ексклюзивність. A [вказує включення значення. A (вказує на виключення. Якщо використовується параметр інклюзивності, потрібно пройти обидва показники.moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
— Ramratan Gupta,

8

Будь ласка, використовуйте четвертий параметр moment.isBet between function (inclusivity). Приклад:

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

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

логічно те саме, що

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

що заощаджує вам пару рядків коду та (в деяких випадках) викликів методу.

Це може бути простіше, ніж витягувати цілий плагін, якщо ви хочете зробити це лише раз або два.


1

Відповідно до документації моменту js,

Плагін Precision 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.