比较Javascript中的日期字符串

比较Javascript中的日期字符串,javascript,knockout.js,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",

我想看看我的数组中是否有一个项目是今天创建的,所以我使用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 

很明显,这个
查询应该被过滤,因为它不是今天创建的。

这里有几个问题

  • 您将一个字符串放入
    格式化
    ,然后稍后使用
    +格式化>-1
    +格式化后的
    将始终是
    NaN
    ,这永远不会是
    -1
    (它也永远不会等于
    -1
    ,也永远不会
    -1

  • 您正在将
    include
    设置为
    true
    ,然后执行
    include=include&&…
    &
    后面的部分永远不会被计算,因为
    &
    左边的部分是
    true
    ,JavaScript(像大多数现代语言一样)会短路表达式

  • 如果
    inquiry
    引用了一个对象,
    +inquiry
    很可能是
    NaN
    ,除非您已经覆盖了它的

  • 您正在比较字符串,这意味着比较中最重要的部分将位于左侧,但日期字符串的格式中最重要的值位于右侧。例如,字符串
    “01/01/2013”
    小于字符串
    “02/02/2012”
    ,尽管它们所代表的日期并非如此。如果您希望有意义地比较日期字符串,则它们必须在左侧显示年份、月份和日期

  • 根据您引用的
    查询.inquiryDate
    字符串,您可以执行以下操作:

    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,则筛选器不会执行任何操作。我的猜测是,你想在这个过滤器函数之外进行检查,你要么调用这个过滤器,要么不调用

    • 因为
      inquiry.inquiryDate
      是一个日期和时间字符串,用空格分隔,首先在空格上拆分,然后取第一部分(日期)并在
      /
      上拆分。然后我们按照
    yy/mm/dd的顺序重新组合

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

  • 当然,您可以使用
    Date
    对象进行此比较,但因为您只需要解析
    查询。总之,将
    Date
    字符串查询到
    Date
    对象中,并且您只需要日分辨率(而不是毫秒分辨率),使用字符串比较似乎是合理的