【问题标题】:Comparing two dates in when one date is in a previous year当一个日期在前一年时比较两个日期
【发布时间】:2020-09-11 17:17:32
【问题描述】:

我有这个函数可以确定两组日期是否重叠。当日期集在同一年时,它可以正常工作,如果有重叠则返回 true。如果其中一个日期来自上一年,则比较无法检测到重叠。

例如:

var obj = { startDate1: "02/01/2020", 
            endDate1: "03/01/2020", 
            startDate2:"02/05/2020", 
            endDate2:"02/15/2020"  }

使用:

if ((obj.endDate1 >= obj.startDate2 && obj.startDate1 <= obj.endDate2) ||
    (obj.endDate2 >= obj.startDate1 && obj.startDate2 <= obj.endDate1)) {  
         
    }

由于日期重叠而返回 true。

但是,当 startDate1 在不同的年份(2019 年)时,如下所示:

var obj = { startDate1: "12/01/2019", 
                endDate1: "03/01/2020", 
                startDate2:"02/05/2020", 
                endDate2:"02/15/2020"  } 

即使 startDate1 和 endDate1 实际上与 startDate2 和 endDate2 重叠,上述表达式也无法检测到重叠。

我尝试使用 moment 和 regex 来格式化日期,但无济于事。任何想法我做错了什么?

编辑:这是我使用时刻的方式:

                        const obj = {
                            startDate1: moment(new Date(value.startDate)).format("MM/DD/YYYY"),
                            endDate1: moment(new Date(value.endDate)).format("MM/DD/YYYY"),
                            startDate2: moment(new Date(startDate)).format("MM/DD/YYYY"),
                            endDate2: moment(new Date(endDate)).format("MM/DD/YYYY")
                        };

我传递给 new Date 的值是 iso 日期字符串。

很抱歉给您带来了困惑..

编辑#2/答案:

我刚刚使用原生 JS Date.parse 转换了日期。

const obj = {
             certStart: Date.parse(value.startDate),
             certEnd: Date.parse(value.endDate),
             startDate: Date.parse(startDate),
             endDate: Date.parse(endDate)    };

【问题讨论】:

  • 你比较的是字符串而不是日期。
  • .format(..) 返回一个string,这意味着所有的值都是字符串。你应该使用moment(value.startDate, "MM/DD/YYYY")

标签: javascript momentjs


【解决方案1】:
  1. 在js中使用Native Date函数
var obj = { 
   startDate1: "02/01/2020", 
   endDate1: "03/01/2020", 
   startDate2:"02/05/2020", 
   endDate2:"02/15/2020"
};
// Create a clone of obj object and convert values to timestamp.
var $dates = {};
$dates.startDate1 = new Date(obj.startDate1).getTime();
$dates.startDate2 = new Date(obj.startDate2).getTime();
$dates.endDate1 = new Date(obj.endDate1).getTime();
$dates.endDate2 = new Date(obj.endDate2).getTime();
  1. 比较时间:
if (($dates.endDate1 >= $dates.startDate2 && $dates.startDate1 <= $dates.endDate2) ||
    ($dates.endDate2 >= $dates.startDate1 && $dates.startDate2 <= $dates.endDate1)) {  
         // etc...
}

【讨论】:

    【解决方案2】:

    使用 new Date() 或 moment.js 创建和操作日期。

    var obj = { startDate1: moment("12/01/2019"), 
                endDate1: moment("03/01/2020"), 
                startDate2:moment("02/05/2020"), 
                endDate2:moment("02/15/2020")} 
    

    和矩函数来操作日期

    【讨论】:

    • moment 是否正确且一致地推断出此处的格式为 MM/DD/YYYY?它是否取决于浏览器的语言环境?假设这将始终如一地工作似乎是一个冒险的赌注......
    • 你是对的,现在是时候了("12-25-1995", "MM-DD-YYYY");解析。查看文档:momentjs.com/docs/#/parsing
    【解决方案3】:

    尽管有您的标签,但您似乎并没有真正使用 momentjs 格式化日期 - 除非您没有共享某些代码。看起来您确实在进行字符串比较。对于一般的日期比较,我建议阅读相关:Compare two dates with JavaScript

    相关 MDN 日期:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

    别忘了参考 moment.js 文档:https://momentjs.com/docs/

    编辑:正如已经指出的,您使用的是.format(),它返回一个显示字符串https://momentjs.com/docs/#/displaying/format/ - 所以您仍在比较字符串而不是日期。

    您可能想结帐isBetween:https://momentjs.com/docs/#/query/is-between/

    【讨论】:

    • 啊,谢谢!更新了我的答案以反映您的更改。
    【解决方案4】:

    将日期字符串解析为Date,然后将其值作为数字获取:

    const [m, d, y] = dateStr.split('/').map(Number)
    
    // month is 0-indexed, whereas year and day are 1-indexed
    const dateVal = new Date(y, m - 1, d).valueOf()
    

    然后,您可以轻松地将它们与&gt;&lt; 等进行比较。

    【讨论】:

    • 不需要,new Date(dateStr) 可以工作,因为日期是可识别的格式。
    • DD/MM/YYYY 也是一种可识别的格式。不过,至少在 Chrome 中,它看起来是对的,但对我的口味来说似乎有点太“神奇”了。 MDN 在文章中提到“强烈反对” Date 构造函数:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    【解决方案5】:

    如果日期字符串为YYYY/MM/DD 格式,则字符串比较将起作用。

    var obj = {
      startDate1: "2019/12/01",
      endDate1: "2020/03/01",
      startDate2: "2020/02/05",
      endDate2: "2020/02/15"
    }
    
    // this will work
    if ((obj.endDate1 >= obj.startDate2 && obj.startDate1 <= obj.endDate2) ||
      (obj.endDate2 >= obj.startDate1 && obj.startDate2 <= obj.endDate1)) {
      console.log('overlap detected')
    }

    【讨论】:

      猜你喜欢
      • 2019-09-26
      • 2017-07-15
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      相关资源
      最近更新 更多