我试图用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! :(");
}
我确信必须有更好的方法来做到这一点。有什么想法吗?
答案 0 :(得分:222)
在版本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
作为忽略单位的第三个参数,在这种情况下,毫秒是默认粒度。
答案 1 :(得分:71)
您可以使用one of the 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
答案 2 :(得分:19)
您可以使用
moment().isSameOrBefore(Moment|String|Number|Date|Array);
moment().isSameOrAfter(Moment|String|Number|Date|Array);
或
moment().isBetween(moment-like, moment-like);
答案 3 :(得分:15)
我确实相信
if (startDate <= date && date <= endDate) {
alert("Yay");
} else {
alert("Nay! :(");
}
也有效......
答案 4 :(得分:13)
每个人都有好消息,那里有isBetween
功能!
更新您的库;)
答案 5 :(得分: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
答案 6 :(得分:5)
if (date.isBefore(endDate)
&& date.isAfter(startDate)
|| (date.isSame(startDate) || date.isSame(endDate))
在逻辑上与
相同if (!(date.isBefore(startDate) || date.isAfter(endDate)))
可以节省几行代码和(在某些情况下)方法调用。
如果您只想这样做一次或两次,可能比拉入整个插件更容易。
答案 7 :(得分:1)
根据时刻js的文档,
由Rob Dawson编写的精确范围插件可用于显示日期/时间范围的精确,人类可读的表示,网址: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