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 momentimport 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:日期之间的日期的主要内容,如果未能解决你的问题,请参考以下文章

在 Moment Js 中获取两个日期之间的小时差

Moment.js 从日期获取日期名称

如何使用 Moment JS 计算范围之间的给定工作日数?

moment.js 连接日期和时间

不一样的日期时间转换(moment.js)

Moment js日期时间比较