Moment.js: Ngày giữa các ngày


118

Tôi đang cố gắng phát hiện bằng Moment.js nếu một ngày cụ thể nằm giữa hai ngày. Kể từ phiên bản 2.0.0, Tim đã thêm isBefore()isAfter() để so sánh ngày tháng.

Vì không có isBetween()phương pháp nào nên tôi nghĩ cách này sẽ hoạt động:

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

Tôi tin rằng cần phải có một cách tốt hơn để làm điều này. Có ý kiến ​​gì không?


Tôi tin rằng bạn muốn ? isBetween || isStart || isEnd
Bergi

Vâng, lỗi đánh máy ở đó, xin lỗi!
Joel A. Villarreal Bertoldi

Câu trả lời:


82

Bạn có thể sử dụng một trong các plugin thời điểm -> phạm vi thời điểm để xử lý phạm vi ngày:

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
làm thế nào để bạn bao gồm các plugin?

2
Bạn chỉ nên bao gồm <script src = "/ javascript / khoảnh khắc range.js"> </ script> sau momentjs
Lukasz Koziara

53
date.isBetween (startDate, endDate); đơn giản hơn nhiều và tránh yêu cầu một plugin bổ sung.
Brendan Nee

moment & moment-Range cung cấp các tùy chọn để định dạng ngày giờ trong khi chuẩn bị phạm vi và sau đó so sánh ngày cho Chứa / Trong / Chồng chéo / Giao nhau / Thêm / Trừ. nếu một số người truy xuất ngày ở một số định dạng đặc biệt, thì người ta có thể chuẩn bị các phạm vi ngày bên trong mảng bằng cách chuyển đổi các ngày đó với định dạng bắt buộc và sau đó chúng ta có thể so sánh.
Sajjad Ali Khan

277

Trong phiên bản 2.9+ có một isBetweenchức năng, nhưng nó độc quyền:

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

Có một cách giải quyết toàn diện ...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

... về mặt logic tương đương với
!(x.isBefore(a) || x.isAfter(b))


Trong phiên bản 2.13 , isBetweenhàm có tham số tùy chọn thứ tư inclusivity,.

Sử dụng nó như thế này:

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

Các đơn vị khác để xem xét: years, months, days, hours, minutes, seconds, milliseconds

Lưu ý: các đơn vị vẫn là tùy chọn. Sử dụng nulllàm đối số thứ ba để bỏ qua các đơn vị trong đó mili giây là độ chi tiết mặc định.

Truy cập Tài liệu chính thức


3
trần nhớ rằng, như đã nêu trong các tài liệu, isBetween là độc quyền
Joaquín L. Robles

x.isBetween(moment(a).subtract(1, 'day'), b)dường như cũng làm được thủ thuật.
James Donnelly

@ThisClark Đó là một giải pháp tốt; Tôi có thể đề nghị một khác có ít chức năng cuộc gọi:!(x.isBefore(a) || x.isAfter(b))
tavnab

Nghĩa exclusivelà gì?
dơi

2
@Batman Hãy xem xét danh sách 1,2,3,4,5. Đặc biệt, 1 và 5 không nằm giữa các giá trị của danh sách này. Tổng hợp, 1 và 5 nằm giữa các giá trị của danh sách này. Bao gồm trái (giống như độc quyền) bao gồm 1, nhưng không bao gồm 5. Quyền (giống như độc quyền trái) bao gồm 5, nhưng không 1.
ThisClark


16

Tôi tin rằng

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

hoạt động quá ...


Phép tính này luôn luôn bỏ qua năm. Ví dụ: Nếu tôi cho startDate = '05 -01-2019 ', endDate = '05 -31-2019' và ngày là '05 -21-2017 ', nó sẽ cho tôi kết quả là "Yay", mặc dù nó sai .
Aakash Maurya

1
@AakashMaurya Bạn đang so sánh các chuỗi, không phải ngày. Đảm bảo rằng bạn xác định startDate / endDate của mình là startDate = new Date ("05-01-2019").
Tiele Declercq

13

Tin vui cho mọi người, có một isBetweenchức năng! Cập nhật thư viện của bạn;)

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


2
Đúng nhưng isBetweenkhông bao gồm
Epoc

4
Phiên bản 2.13.0 giới thiệu tính độc quyền. A [cho biết bao gồm một giá trị. A (chỉ trừ Nếu tham số inclusivity được sử dụng, cả hai chỉ số phải được thông qua..moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
Ramratan Gupta

8

Vui lòng sử dụng tham số thứ 4 của hàm moment.isBetween (bao gồm). Thí dụ:

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

về mặt logic giống như

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

giúp bạn tiết kiệm một vài dòng mã và (trong một số trường hợp) các cuộc gọi phương thức.

Có thể dễ dàng hơn việc kéo toàn bộ plugin nếu bạn chỉ muốn làm điều này một hoặc hai lần.


1

Theo tài liệu về thời điểm js,

Có plugin Phạm vi chính xác, được viết bởi Rob Dawson, có thể được sử dụng để hiển thị các đại diện chính xác, có thể đọc được của con người về phạm vi ngày / giờ, 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.