Moment.js:日期之间的日期
Posted
技术标签:
【中文标题】Moment.js:日期之间的日期【英文标题】:Moment.js: Date between dates 【发布时间】:2013-01-31 14:20:20 【问题描述】:我正在尝试使用 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
?
是的,错字了,抱歉!
【参考方案1】:
你可以使用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
【讨论】:
如何包含插件? 你应该只在momentjs之后包含 date.isBetween(startDate, endDate);更简单,避免需要额外的插件。 moment & moment-Range 提供了在准备范围时格式化日期时间的选项,然后比较包含/包含/重叠/相交/添加/减去的日期。如果有人以某种特殊格式检索日期,则可以通过将这些日期转换为所需格式来准备数组内的日期范围,然后我们可以进行比较。 在npm install moment
、import moment from 'moment';
之后进行反应【参考方案2】:
我相信
if (startDate <= date && date <= endDate)
alert("Yay");
else
alert("Nay! :(");
也可以...
【讨论】:
这个计算总是忽略年份。例如,如果我给 startDate ='05-01-2019',endDate = '05-31-2019' 和 date 为 '05-21-2017',它会给我结果为“Yay”,虽然它是错误的. @AakashMaurya 您正在比较字符串,而不是日期。确保将 startDate/endDate 定义为 startDate=new Date("05-01-2019")。【参考方案3】:根据moment js的文档,
有一个由 Rob Dawson 编写的 Precise Range 插件,可用于显示日期/时间范围的精确、人类可读的表示,网址: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
【讨论】:
【参考方案4】:if (date.isBefore(endDate)
&& date.isAfter(startDate)
|| (date.isSame(startDate) || date.isSame(endDate))
逻辑上与
相同if (!(date.isBefore(startDate) || date.isAfter(endDate)))
这可以为您节省几行代码和(在某些情况下)方法调用。
如果您只想这样做一两次,可能比拉入整个插件更容易。
【讨论】:
【参考方案5】:大家好消息,有一个isBetween
功能!
更新你的图书馆;)
http://momentjs.com/docs/#/query/is-between/
【讨论】:
是的,但isBetween
不包括在内
2.13.0 版引入了排他性。 [ 表示包含值。 A(表示排除。如果使用inclusivity参数,则必须同时传递两个指标。moment('2016-10-30').isBetween('2016-10-30', '2016-10-30', null, '[]'); //true
【参考方案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
作为第三个参数以忽略单位,在这种情况下,毫秒是默认粒度。
Visit the Official Docs
【讨论】:
请记住,如文档中所述,isBetween 是专有的x.isBetween(moment(a).subtract(1, 'day'), b)
似乎也能解决问题。
@ThisClark 这是一个很好的解决方法;我是否可以建议另一个函数调用较少的函数:!(x.isBefore(a) || x.isAfter(b))
exclusive
是什么意思?
@Batman 考虑列表 1,2,3,4,5。排他地,1 和 5 不在此列表的值之间。包括,1 和 5 在此列表的值之间。左含(与右排同)包含 1,但不包含 5。右包含(与左排相同)包含 5,但不包含 1。【参考方案7】:
请使用 moment.isBetween 函数的第四个参数(包容性)。示例:
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
【讨论】:
【参考方案8】:你可以使用
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以上是关于Moment.js:日期之间的日期的主要内容,如果未能解决你的问题,请参考以下文章