Moment.js: Tarihler arasındaki tarih


118

Belirli bir tarihin iki tarih arasında olup olmadığını Moment.js ile tespit etmeye çalışıyorum. Sürüm 2.0.0 beri Tim eklendi isBefore()ve isAfter()tarih karşılaştırma için.

isBetween()Yöntem olmadığından , bunun işe yarayacağını düşündüm:

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! :("); }

Bunu yapmanın daha iyi bir yolu olması gerektiğine ikna oldum. Herhangi bir fikir?


İstediğine emin miyim ? isBetween || isStart || isEnd
Bergi

Evet, yazım hatası var, üzgünüm!
Joel A. Villarreal Bertoldi

Yanıtlar:


81

Tarih aralığı ile uğraşmak için an eklentisinden -> moment aralığından birini kullanabilirsiniz :

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
eklentiyi nasıl dahil edersiniz?

2
Momentjs'den sonra sadece <script src = "/ javascripts / moment-range.js"> </script> eklemelisiniz
Lukasz Koziara

54
date.isBetween (startDate, endDate); çok daha basittir ve ek bir eklenti gerektirmez.
Brendan Nee

moment & moment-Range, aralıkları hazırlarken tarih saatini biçimlendirme ve ardından İçerir / İçinde / Çakışmalar / Kesişim / Ekle / Çıkarma için tarihleri ​​karşılaştırmak için seçenekler sunar. eğer biri bazı özel formatlarda tarihleri ​​alırsa, o zaman bu tarihleri ​​gerekli formatta dönüştürerek dizi içinde tarih aralıkları hazırlayabilir ve sonra karşılaştırabiliriz.
Sajjad Ali Khan

278

Gelen sürümleri 2,9 + orada olduğunu isBetweenfonksiyonu, ancak özel özel haberi:

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

Kapsayıcı bir çözüm var ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

... mantıksal olarak eşdeğer olan
!(x.isBefore(a) || x.isAfter(b))


Gelen sürüm 2.13isBetween fonksiyonu, dördüncü bir isteğe bağlı bir parametre vardır inclusivity.

Bunu şu şekilde kullanın:

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

Dikkate alınacak daha fazla birim: years, months, days, hours, minutes, seconds, milliseconds

Not: birimler hala isteğe bağlıdır. nullBirimleri göz ardı etmek için üçüncü bağımsız değişken olarak kullanın ; bu durumda varsayılan ayrıntı düzeyi milisaniyedir.

Resmi Belgeleri Ziyaret Edin


4
belgelerde belirtildiği gibi, isBetween'in özel olduğunu unutmayın
Joaquín L. Robles

x.isBetween(moment(a).subtract(1, 'day'), b)hile de yapıyor gibi görünüyor.
James Donnelly

@ThisClark Bu iyi bir çözüm; Daha az işlev çağrısı olan başka bir tane önerebilir miyim:!(x.isBefore(a) || x.isAfter(b))
tavnab

Ne anlama exclusivegeliyor?
Batman

2
@Batman 1,2,3,4,5 listesini düşünün. Münhasıran, 1 ve 5 bu listenin değerleri arasında değildir. Kapsayıcı olarak, 1 ve 5 bu listenin değerleri arasındadır. Sol dahil (sağ hariç olmak üzere aynı) 1'i içerir, ancak 5'i içermez. Sağa dahil (sol hariç ile aynı) 5'i içerir ancak 1'i
içermez


16

Buna inanıyorum

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

çok çalışıyor ...


Bu hesaplama her zaman yılı göz ardı eder. Örneğin, startDate = '05 -01-2019 ', endDate = '05 -31-2019' ve tarihi '05 -21-2017 'olarak verirsem, yanlış olmasına rağmen bana "Yay" olarak sonuç verecektir .
Aakash Maurya

1
@AakashMaurya Tarihleri ​​değil dizeleri karşılaştırıyorsunuz. StartDate / endDate'inizi startDate = new Date ("05-01-2019") olarak tanımladığınızdan emin olun.
Tiele Declercq

13

Herkese iyi haber, bir isBetweenişlevi var! Kitaplığınızı güncelleyin;)

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


2
Doğru ama isBetweenkapsayıcı değil
Epoc

4
Sürüm 2.13.0 ayrıcalık sunar. A [bir değerin dahil edildiğini gösterir. A (hariç moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
tutmayı

8

Lütfen moment.isBetween fonksiyonunun (dahil olma) 4. parametresini kullanın. Misal:

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))

mantıksal olarak aynıdır

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

Bu size birkaç satır kod ve (bazı durumlarda) yöntem çağrıları kazandırır.

Bunu yalnızca bir veya iki kez yapmak istiyorsanız, tüm bir eklentiyi kullanmaktan daha kolay olabilir.


1

Js anının dokümantasyonuna göre,

Rob Dawson tarafından yazılan Kesin Aralık eklentisi, tarih / saat aralıklarının tam, insan tarafından okunabilir temsillerini görüntülemek için kullanılabilir, 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.