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.