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?


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

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


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


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/


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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.