Moment.js: Tanggal antar tanggal

118

Saya mencoba mendeteksi dengan Moment.js jika tanggal tertentu berada di antara dua tanggal. Sejak versi 2.0.0, Tim menambahkan isBefore()dan isAfter()untuk perbandingan tanggal.

Karena tidak ada isBetween()metode, saya pikir ini akan berhasil:

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

Saya yakin pasti ada cara yang lebih baik untuk melakukan ini. Ada ide?

Joel A. Villarreal Bertoldi
sumber
Saya yakin Anda menginginkannya ? isBetween || isStart || isEnd
Bergi
Ya, salah ketik di sana, maaf!
Joel A. Villarreal Bertoldi

Jawaban:

81

Anda dapat menggunakan salah satu plugin momen -> rentang-momen untuk menangani rentang tanggal:

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
Lukasz Koziara
sumber
1
bagaimana Anda memasukkan plugin?
2
Anda hanya perlu memasukkan <script src = "/ javascripts / moment-range.js"> </script> setelah momentjs
Lukasz Koziara
54
date.isBetween (startDate, endDate); jauh lebih sederhana dan tidak memerlukan plugin tambahan.
Brendan Nee
momen & momen-Rentang memberikan opsi untuk memformat waktu tanggal sambil menyiapkan rentang dan kemudian membandingkan tanggal untuk Berisi / Dalam / Tumpang Tindih / Berpotongan / Tambah / Kurangi. Jika seseorang mengambil tanggal dalam beberapa format khusus, maka seseorang dapat menyiapkan rentang tanggal di dalam larik dengan mengubah tanggal tersebut dengan format yang diperlukan dan kemudian kita dapat membandingkannya.
Sajjad Ali Khan
278

Di versi 2.9+ ada isBetweenfungsi, tetapi eksklusif:

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

Ada solusi yang inklusif ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

... yang secara logis setara dengan
!(x.isBefore(a) || x.isAfter(b))


Dalam versi 2.13 , isBetweenfungsi memiliki parameter opsional keempat inclusivity,.

Gunakan seperti ini:

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

Lebih banyak unit untuk dipertimbangkan: years, months, days, hours, minutes, seconds, milliseconds

Catatan: unit masih opsional. Gunakan nullsebagai argumen ketiga untuk mengabaikan unit yang dalam hal ini milidetik adalah perincian default.

Kunjungi Dokumen Resmi

ThisClark
sumber
4
ingatlah bahwa, seperti yang dinyatakan dalam dokumen, isBetween bersifat eksklusif
Joaquín L. Robles
x.isBetween(moment(a).subtract(1, 'day'), b)tampaknya melakukan triknya juga.
James Donnelly
@ThisClark Itu solusi yang bagus; mungkin saya menyarankan yang lain dengan panggilan fungsi yang lebih sedikit:!(x.isBefore(a) || x.isAfter(b))
tavnab
Apa exclusivemaksudnya
Batman
2
@Batman Pertimbangkan daftarnya 1,2,3,4,5. Secara eksklusif, 1 dan 5 tidak berada di antara nilai-nilai dari daftar ini. Secara inklusif, 1 dan 5 berada di antara nilai-nilai dari daftar ini. Termasuk kiri (sama dengan eksklusif kanan) termasuk 1, tapi tidak 5. Kanan inklusif (sama dengan eksklusif kiri) termasuk 5, tapi tidak 1.
ThisClark
16

Saya percaya itu

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

bekerja juga ...

Tiele Declercq
sumber
Perhitungan ini selalu mengabaikan tahun. Misalnya, Jika saya memberikan startDate = '05 -01-2019 ', endDate = '05 -31-2019' dan tanggal sebagai '05 -21-2017 ', itu akan memberi saya hasil sebagai "Yay", meskipun itu salah .
Aakash Maurya
1
@AakashMaurya Anda membandingkan string, bukan tanggal. Pastikan Anda menentukan startDate / endDate Anda sebagai startDate = new Date ("05-01-2019").
Tiele Declercq
13

Kabar baik semuanya, ada isBetweenfungsinya! Perbarui perpustakaan Anda;)

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

Luna
sumber
2
Benar tetapi isBetweentidak inklusif
Epoc
4
Versi 2.13.0 memperkenalkan eksklusivitas. A [menunjukkan penyertaan nilai. A (menunjukkan pengecualian. Jika parameter inklusivitas digunakan, kedua indikator harus dilewati.moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
Ramratan Gupta
8

Silakan gunakan parameter ke-4 fungsi moment.isBetween (inklusivitas). Contoh:

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
Raffael Bechara Rameh
sumber
5
if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))

secara logis sama dengan

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

yang menghemat beberapa baris kode dan (dalam beberapa kasus) pemanggilan metode.

Mungkin lebih mudah daripada menarik seluruh plugin jika Anda hanya ingin melakukan ini sekali atau dua kali.

Jamie Humphries
sumber
1

Sesuai dokumentasi momen js,

Ada plugin Precise Range, yang ditulis oleh Rob Dawson, dapat digunakan untuk menampilkan representasi rentang tanggal / waktu yang tepat dan dapat dibaca manusia, 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
Mohammed Safeer
sumber