Moment.js:日期之间的日期

Joe*_*ldi 101 javascript date momentjs

我试图用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! :("); }

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

Thi*_*ark 238

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
Run Code Online (Sandbox Code Playgroud)

有一个包容性的解决方案......
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
Run Code Online (Sandbox Code Playgroud)

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

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

访问官方文档

  • 请记住,正如文档中所述,isBetween是独占的 (3认同)
  • @Batman考虑清单1,2,3,4,5.仅此而言,1和5不在此列表的值之间.包含在内,1和5位于此列表的值之间.左包含(与右独占相同)包括1,但不包括5.右包含(与左独占相同)包括5,但不包括1. (2认同)

Luk*_*ara 75

您可以使用其中一个时刻插件 - > 时刻范围来处理日期范围:

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
Run Code Online (Sandbox Code Playgroud)

  • date.isBetween(startDate,endDate); 更简单,避免需要额外的插件. (43认同)
  • 你应该在 momentjs 之后包含 <script src="/javascripts/moment-range.js"></script> (2认同)

Vij*_*iya 20

您可以使用

moment().isSameOrBefore(Moment|String|Number|Date|Array);
moment().isSameOrAfter(Moment|String|Number|Date|Array);
Run Code Online (Sandbox Code Playgroud)

要么

moment().isBetween(moment-like, moment-like);
Run Code Online (Sandbox Code Playgroud)

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

  • 快速说明:``isBetween''需要时刻2.13.0。http://momentjs.com/docs/#/query/is-between/ (2认同)

Tie*_*rcq 16

我确实相信

if (startDate <= date && date <= endDate) {
  alert("Yay");
} else {
  alert("Nay! :("); 
}
Run Code Online (Sandbox Code Playgroud)

也工作......


Lun*_*una 13

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

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

  • 是的,但 `isBetween` 不包括在内 (2认同)
  • 版本2.13.0引入了排他性.A [表示包含值.A(表示排除.如果使用包含性参数,则必须传递两个指标."时刻('2016-10-30').isBetween('2016-10-30','2016-10-30',null, '[]'); // true` (2认同)

Raf*_*meh 6

请使用moment.isBetween函数(包含性)的第4个参数.例:

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
Run Code Online (Sandbox Code Playgroud)


Jam*_*ies 5

if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))
Run Code Online (Sandbox Code Playgroud)

在逻辑上是相同的

if (!(date.isBefore(startDate) || date.isAfter(endDate)))
Run Code Online (Sandbox Code Playgroud)

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

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