【问题标题】:Moment.js: Date between datesMoment.js:日期之间的日期
【发布时间】: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?
  • 是的,错字了,抱歉!

标签: javascript date momentjs


【解决方案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/

        【讨论】:

        猜你喜欢
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 2017-12-08
        • 1970-01-01
        • 2019-03-31
        相关资源
        最近更新 更多