【问题标题】:Detect and compare two string date values javascript检测和比较两个字符串日期值javascript
【发布时间】:2017-04-10 05:11:59
【问题描述】:

我在 Angularjs 中有两个 JavaScript objects。他们都有相同的keys,但不同的values。看起来像这样:

$scope.object1 = {
    name: 'Arpit',
    roll_no: 999, // Number
    creation_date: '2017-04-10T04:44:21.923Z', // date value but string
    joining_date: '2017-03-30T18:30:00.000Z' // date value but string
}

第二个对象是:

$scope.object2 = {
    name: 'Arpit1',
    roll_no: '999', // Number but string
    creation_date: 2017-04-10T04:44:21.923Z, // date value not string
    joining_date: 2017-03-30T18:30:00.000Z // date value not string
}

现在我想比较这个对象并检测不同的值。 相比之下,999 应该等于 '999''2017-03-30T18:30:00.000Z' 应该等于 2017-03-30T18:30:00.000Z,以此类推。

挑战

日期和数字的值可能是字符串格式,所以首先我需要检测给定的字符串是日期还是数字,然后进行比较。

我的代码

var data = {
     options:{
        data: $scope.object1
     },
     newData: $scope.object2
}

angular.forEach(data.options.data, function (value, key) {

    //compare fields
    if (data.newData[key] != data.options.data[key]) {

        if (filedsToSkip.indexOf(key) == -1) {

            if ((angular.isDate(data.newData[key]) || angular.isDate(data.options.data[key])) && new Date(data.newData[key]) != new Date(data.options.data[key])) {
                $ctrl.updatedFields.push({
                    field: key,
                    newValue: data.newData[key],
                    oldValue: data.options.data[key]
                });
            } 
        } else {
            console.log("Field skipped");
        }


    }
});

但是这段代码不能正常工作。请给点建议。

谢谢。

编辑

现在,当我运行此代码时,它显示所有字段都不同,但我希望它只显示 name 不同。

【问题讨论】:

  • 我不确定这是否会导致问题。在第 15 行(大 if 条件)中,当 isDate 对其中一个值为假而对另一个值为真时会发生什么?在这种情况下,条件的第一部分似乎为真,第二部分也可能为真,因为Date 也可以返回一个数字的有效结果(例如new Date("2017")
  • 如果您指定什么不能正常工作会有所帮助,即预期输出是什么以及您的代码输出与此有何不同。
  • 另外,您为ifelse if 执行的块完全相同。
  • 我面临同样的问题。这是说2017-03-30T18:30:00.000Z 不等于"2017-03-30T18:30:00.000Z"
  • 您可以尝试的另一件事是使用正则表达式来验证日期(特别是如果它们是 Unix 格式)并继续使用其余代码。例如,请参阅here

标签: javascript angularjs date object numbers


【解决方案1】:

您可以使用!isNaN(Date.parse(v)) 来评估该值是否为日期:

let possible = [999, '999', '2017-03-30T18:30:00.000Z']

possible.forEach((v) => {
  console.log("is date : ", !isNaN(Date.parse(v)));
});

如果true,那么您可以进行比较。

【讨论】:

  • @Zze_,但是在数字比较的情况下会发生冲突。它也说true 的号码。
  • woahhhhhhhhh - 所以我刚刚在 Chrome 中测试了这一点,并且确实适用于所有人。 FF 和 edge 符合预期。
【解决方案2】:

得到一些建议后,我修改了代码:

angular.forEach(data.options.data, function (value, key) {

    //compare
    if (data.newData[key] != data.options.data[key]) {

        if (filedsToSkip.indexOf(key) == -1) {

            if ((angular.isDate(data.newData[key]) || angular.isDate(data.options.data[key])) && new Date(String(data.newData[key])) !== new Date(String(data.options.data[key]))) {
                $ctrl.updatedFields.push({
                    field: key,
                    newValue: data.newData[key],
                    oldValue: data.options.data[key]
                });
            } else if (data.newData[key] !== "" && data.options.data[key] !== "") {
                $ctrl.updatedFields.push({
                    field: key,
                    newValue: data.newData[key],
                    oldValue: data.options.data[key]
                });
            }

        } else {
            console.log("Field skipped");
        }
    }
});

而且它工作正常。我不确定它是否是一个 100% 完美的解决方案,但我可以接受。谢谢。

【讨论】:

    【解决方案3】:

    正如this comment 所展示的,两个日期对象之间的比较可能很棘手:

    var d1 = new Date();
    var d2 = new Date(d1);
    d1!==d2;  //true
    

    不过,我认为 OP 的答案并没有完全到位。考虑这个例子:

    var x  = '2017-04-10T04:44:21.923Z';
    var d1  = new Date(String(x));
    var d2 = new Date(String(x));
    d1!==d2; //true
    

    我建议使用this 答案中的一种解决方案。也许使用getTime() 来比较日期。在上面的例子中:

    d1.getTime()!==d2.getTime(); //false
    

    【讨论】:

      猜你喜欢
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 2019-07-25
      • 2013-06-24
      相关资源
      最近更新 更多