【问题标题】:How to compare two dates with momentJS ignoring the year value?如何比较两个日期与momentJS忽略年份值?
【发布时间】:2015-11-14 04:42:17
【问题描述】:

假设一个学期从 2015 年 11 月 1 日到 2016 年 1 月 3 日。要比较的示例日期如下('YYYY-MM-DD'):

2015-10-12 = false
2015-11-01 = true (inclusive)
2015-12-20 = true
2015-01-03 = true (inclusive)
2016-01-30 = false
2017-11-21 = true (year is ignored)
2010-12-20 = true (year is ignored)

有没有办法可以用 MomentJS 实现这个结果?

【问题讨论】:

  • 最简单的解决方案是测试目标日期是否在界限内,如果是,则返回 true,否则将目标日期的年份(您可能需要使用它的副本)设置为2015,检测是否在范围内,如果是,返回true,否则,设置年份为2016,检测是否在范围内,如果是,返回true,否则返回false
  • 感谢您的反馈。当我在日历中使用它时,我会对每个用户查询进行多次比较。我只是想知道是否有另一种方法。
  • 有一个使用'____-MM-DD' 格式忽略年份和isBetween() 进行比较的anwser。我想知道为什么那个人删除了他的帖子,解决方案有效。我在删除之前测试了代码:pastebin.com/NSJVRdxY
  • @ShanShan ...我也看到了,想知道这是否真的有效。我认为只有在边界没有不同的年份时才会起作用。如果它实际上适用于不同的年份,则该方法将始终返回积极的结果。我想,这就是它被删除的原因
  • @ShanShan 这是因为它没有正确处理一月份的日期。忽略年份意味着 2017-01-03 默认为 2015-01-03,不在 2015-11-01 到 2016-01-03 的范围内。我修复了它,更新的答案如下。

标签: javascript datetime momentjs


【解决方案1】:

可以使用isBetween,但有点乱。

function isWithinTerm(dateString) {
  var dateFormat = '____-MM-DD', // Ignore year, defaults to current year
      begin = '2015-10-31', // Subtract one day from start of term
      end = '2016-01-04', // Add one day to finish of term
      mom = moment(dateString, dateFormat); // Store to avoid re-compute below
  return mom.isBetween(begin, end) || mom.add(1, 'y').isBetween(begin, end);
}

我添加一年作为可选检查的原因仅适用于自 2015 年 1 月以来的 1 月案例,显然不在 2015 年 11 月至 2016 年 1 月之间。我知道这有点老套,但我想不出任何更简单的方法。

【讨论】:

  • 感谢您在 momentJS 中指出 '__' 语法。直到现在我才知道它,可能对我的其他日期操作有用:)
【解决方案2】:

它会像这样工作:https://jsfiddle.net/3xxe3Lg0/

var moments = [
'2015-10-12',
'2015-11-01',
'2015-12-20',
'2015-01-03',
'2016-01-30',
'2017-11-21',
'2010-12-20'];

var boundaries = [moment('2015-11-01').subtract(1, 'days'),moment('2016-01-03').add(1, 'days')];

for (var i in moments){
    res = moments[i] + ': ';
    if (
        moment(moments[i]).year(boundaries[0].year()).isBetween(boundaries[0], boundaries[1]) ||
        moment(moments[i]).year(boundaries[1].year()).isBetween(boundaries[0], boundaries[1])

       ){
        res += 'true';
    }
    else{
        res += 'false';
    }
    $('<div/>').text(res).appendTo($('body'));
}

编辑:如果上限不是比下限提前一年而是两年(或更多)年,它甚至可以进行微小的更改。

for (var i in moments){
    res = moments[i] + ': ';
    if (
        moment(moments[i]).year(boundaries[0].year()).isBetween(boundaries[0], boundaries[1]) ||
        moment(moments[i]).year(boundaries[0].year()+1).isBetween(boundaries[0], boundaries[1])

       ){
        res += 'true';
    }
    else{
        res += 'false';
    }
    $('<div/>').text(res).appendTo($('body'));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多