比较Javascript中的日期字符串
我想看看我的数组中是否有一个项目是今天创建的,所以我使用arrayFilter来过滤数组中的每个元素,问题是,我无法让我的过滤器正常工作:比较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",
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
对象中,并且您只需要日分辨率(而不是毫秒分辨率),使用字符串比较似乎是合理的