140

我正在尝试使用 Moment.js 检测给定日期是否在两个日期之间。从 2.0.0 版本开始,Tim 添加了isBefore()isAfter()用于日期比较。

由于没有isBetween()方法,我认为这会起作用:

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

我相信必须有更好的方法来做到这一点。有任何想法吗?

4

8 回答 8

330

2.9+ 版本中有一个isBetween功能,但它是专有的:

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

有一个包容性的解决方法...
x.isBetween(a, b) || x.isSame(a) || x.isSame(b)

...这在逻辑上等同于
!(x.isBefore(a) || x.isAfter(b))


2.13 版本中,该isBetween函数有第四个可选参数inclusivity.

像这样使用它:

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

更多要考虑的单位:years, months, days, hours, minutes, seconds, milliseconds

注意:单位仍然是可选的。用作第三个参数以忽略单位,在null这种情况下,毫秒是默认粒度。

访问官方文档

于 2015-04-07T15:45:00.910 回答
97

您可以使用moment 插件-> moment-range之一来处理日期范围:

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
于 2013-02-15T15:56:15.697 回答
30

您可以使用

moment().isSameOrBefore(Moment|String|Number|Date|Array);
moment().isSameOrAfter(Moment|String|Number|Date|Array);

或者

moment().isBetween(moment-like, moment-like);

见这里: http: //momentjs.com/docs/#/query/

于 2016-10-21T10:55:40.127 回答
16

我相信

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

也可以...

于 2014-04-10T11:55:45.797 回答
15

大家好消息,有一个isBetween功能!更新你的图书馆;)

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

于 2015-03-17T19:10:25.207 回答
11

请使用 moment.isBetween 函数的第四个参数(包容性)。例子:

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
于 2016-10-17T12:28:07.213 回答
7
if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))

在逻辑上与

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

这为您节省了几行代码和(在某些情况下)方法调用。

如果您只想这样做一两次,可能比拉入整个插件更容易。

于 2015-03-05T10:26:23.330 回答
1

根据 moment js 的文档,

有一个由 Rob Dawson 编写的 Precise Range 插件,可用于显示日期/时间范围的精确、人类可读的表示,网址: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
于 2014-11-12T12:01:59.223 回答