Moment.js:日期之间的日期


118

我正在尝试使用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! :("); }

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


我相信你想要吗?isBetween || isStart || isEnd
Bergi 2013年

是的,那里有错字,对不起!
Joel A. Villarreal Bertoldi

Answers:


82

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

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
您如何包含插件?

2
您应该在momentjs之后添加<script src =“ / javascripts / moment-range.js”> </ script>
Lukasz Koziara 2014年

53
date.isBetween(startDate,endDate); 简单得多,并且避免了需要额外的插件。
布伦丹·尼

moment&moment-Range提供选项,可在准备范围时格式化日期时间,然后比较“包含” /“内部” /“重叠” /“相交” /“加” /“减”的日期。如果有人以某种特殊格式检索日期,则可以通过将日期转换为所需格式来准备数组中的日期范围,然后进行比较。
Sajjad Ali Khan 2016年

276

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作为第三个参数忽略单位在这种情况下毫秒是默认的粒度。

访问官方文档


3
裸记住,如文档指出,isBetween是独家
华金属罗伯斯

x.isBetween(moment(a).subtract(1, 'day'), b)似乎也能解决问题。
詹姆斯·唐纳利

@ThisClark这是一个很好的解决方法;我可以建议另一个函数调用更少的方法!(x.isBefore(a) || x.isAfter(b))

什么exclusive意思
蝙蝠侠

2
@蝙蝠侠考虑列表1,2,3,4,5。排他地,1和5不在此列表的值之间。包括1和5在此列表的值之间。左包括(与右排除相同)包括1,但不包括5。右包括(与左排除相同)包括5,但不包括
1。– ThisClark


16

我相信

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

也可以...


此计算始终忽略年份。例如,如果我给定startDate = '05 -01-2019',endDate = '05 -31-2019',日期为'05 -21-2017',虽然它是错误的,但结果为“ Yay” 。
阿卡什(Aakash Maurya)

1
@AakashMaurya您正在比较字符串,而不是日期。确保将startDate / endDate定义为startDate = new Date(“ 05-01-2019”)。
Tiele Declercq


8

请使用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

5
if (date.isBefore(endDate) 
 && date.isAfter(startDate) 
 || (date.isSame(startDate) || date.isSame(endDate))

在逻辑上与

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

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

如果只想执行一次或两次,可能比拉入整个插件要容易。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.