Moment.js: 日期之间的日期

我试图用 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”) ;

如果(date.isBefore (endDate) IsAfter (startDate) | | (date.isSame (startDate) | | date.isSame (endDate)) ) { 警报(“呀!”) ; { 警告(“ Nay! : (”) ; }

我相信一定有更好的办法,有什么主意吗?

219695 次浏览

你可以使用 瞬间插件-> 力矩范围来处理日期范围:

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

我相信

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

工作太..。

根据 Momentjs 的文档,

有一个精确范围插件,由 Rob Dawson 编写,可以用来显示精确的,人类可读的日期/时间范围的表示,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
if (date.isBefore(endDate)
&& date.isAfter(startDate)
|| (date.isSame(startDate) || date.isSame(endDate))

在逻辑上与

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

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

如果您只想执行一次或两次此操作,那么可能比插入整个插件更容易。

好消息,各位,有一个 isBetween功能! 更新你的库;)

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

版本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作为第三个参数,忽略默认粒度为毫秒的单位。

浏览官方文件

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

你可以用

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/