Moment.js:日期之间的日期

IT技术 javascript 日期 瞬间
2021-01-20 06:19:07

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

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

6个回答

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

访问官方文档

@ThisClark 这是一个很好的解决方法;我可以建议另一个函数调用更少的:!(x.isBefore(a) || x.isAfter(b))
2021-03-16 06:19:07
@Batman 考虑列表 1、2、3、4、5。仅此,1 和 5 不在此列表的值之间。其中,1 和 5 位于此列表的值之间。左包含(同右独)包含1,但不包含5。右包含(同左不包含)包含5,但不包含1。
2021-03-22 06:19:07
x.isBetween(moment(a).subtract(1, 'day'), b) 似乎也能解决问题。
2021-04-08 06:19:07
什么exclusive意思?
2021-04-08 06:19:07
请记住,如文档中所述, isBetween 是独占的
2021-04-10 06:19:07

您可以使用moment plugin -> 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
moment & moment-Range 提供了在准备范围时格式化日期时间的选项,然后比较包含/内部/重叠/相交/添加/减去的日期。如果有人以某种特殊格式检索日期,则可以通过将这些日期转换为所需格式来准备数组内的日期范围,然后我们可以进行比较。
2021-03-17 06:19:07
date.isBetween(startDate, endDate); 更简单,避免需要额外的插件。
2021-03-24 06:19:07
你如何包含插件?
2021-03-31 06:19:07
你应该在 momentjs 之后包含 <script src="/javascripts/moment-range.js"></script>
2021-04-01 06:19:07
对于反应之后npm install momentimport moment from 'moment';
2021-04-12 06:19:07

您可以使用

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/

快速说明:isBetween需要时刻 2.13.0。momentjs.com/docs/#/query/is-between
2021-03-18 06:19:07

我相信

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

也能用...

此计算始终忽略年份。例如,如果我给 startDate ='05-01-2019', endDate = '05-31-2019' 和日期为 '05-21-2017',它会给我结果为“Yay”,虽然它是假的.
2021-03-18 06:19:07
@AakashMaurya 您正在比较字符串,而不是日期。确保将 startDate/endDate 定义为 startDate=new Date("05-01-2019")。
2021-04-01 06:19:07

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

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

真实但isBetween不包括在内
2021-03-23 06:19:07
2.13.0 版引入了排他性。A [ 表示包含一个值。A ( 表示排除。如果使用 inclusivity 参数,则两个指标都必须通过。moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
2021-03-23 06:19:07