在Javascript中比较日期字符串

时间:2012-11-26 14:15:59

标签: javascript knockout.js

我想知道我的数组中的项是否是今天创建的,所以我使用arrayFilter来过滤我的数组中的每个元素,问题是,我无法使我的过滤器正常工作:

return ko.utils.arrayFilter(self.enquiries(), function (enquiry) {
    var include = true;

    if (self.onlyToday()) {
        var formatted = $.datepicker.formatDate("dd/mm/yy", new Date());

        include = include && +enquiry.EnquiryDate.indexOf(+formatted > -1);
    }

    return include;
});

以下是我的数据:

formatted: 26/11/2012
enquiry.EnquiryDate: 08/11/2012 08:46:46 

很明显,应该过滤此enquiry,因为它今天没有创建。

1 个答案:

答案 0 :(得分:2)

这里有几个问题。

  1. 您在formatted中添加了一个字符串,然后使用+formatted > -1+formatted始终为NaN,永远不会> -1(它也永远不会等同于-1而永远不会< -1。)

  2. 您将include设置为true,然后执行include = include && ...&&之后的部分永远不会被评估,因为&&左侧的部分是true,而JavaScript(就像大多数现代语言一样)是短路表达式。

    < / LI>
  3. 如果enquiry引用某个对象,+enquiry可能会NaN,除非您已覆盖其valueOf

  4. 您正在比较字符串,这意味着比较的最重要部分将位于左侧 - 但您的日期字符串采用的格式是最重要的值在。例如,字符串 "01/01/2013" 小于 字符串 "02/02/2012",即使当然不是这样他们所代表的日期。如果你想有意义地比较日期字符串,他们必须在左边是年份,然后是月份,然后是当天。

  5. 根据您引用的enquiry.EnquiryDate字符串,您可以执行以下操作:

    var today = $.datepicker.formatDate("yy/mm/dd", new Date());
    return ko.utils.arrayFilter(self.enquiries(), function (enquiry) {
        var parts, enqDate;
    
        parts = enquiry.EnquiryDate.split(' ')[0].split('/');
        enqDate = parts[2] + '/' + parts[1] + '/' + parts[0];
        return enqDate === today;
    });
    

    以上注释:

    • 请注意,我今天的日期是左边的年份。

    • 我删除了self.onlyToday()位,因为如果self.onlyToday()为false,则过滤器没有执行任何操作。我的猜测是你想要在这个过滤器功能之外进行检查,你要么打算调用这个过滤器。

    • 由于enquiry.EnquiryDate是日期时间字符串,以空格分隔,首先我们将其拆分为空格,然后我们取第一部分(日期)和将其拆分为/。然后我们以yy/mm/dd顺序重新组合。

    • 现在我们知道我们可以对字符串执行===查看查询日期是否等于今天。

    当然,您可以使用Date个对象进行此比较,但是您只需要将enquiry.EnquiryDate字符串解析为Date个对象,而您只需要一天分辨率(不是毫秒分辨率),使用字符串比较似乎是合理的。