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.