[英]Comparing date strings in Javascript
我想看看我的數組中的項是否是今天創建的,所以我使用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
應該被過濾,因為它今天沒有創建。
這里有幾個問題。
你正在formatted
一個字符串,然后使用+formatted > -1
。 +formatted
將永遠是NaN
,它永遠不會> -1
(它也永遠不會等於-1
而且永遠不會< -1
)。
您將include
設置為true
,然后執行include = include && ...
&&
永遠不會被評估,因為&&
左邊的部分是true
而JavaScript(像大多數現代語言一樣)是短路表達式。
如果enquiry
是指對象,則+enquiry
可能是NaN
除非您已覆蓋其valueOf
。
您正在比較字符串 ,這意味着比較的最重要部分將位於左側 - 但您的日期字符串采用的格式是最重要的值在右側 。 因此,例如, 字符串 "01/01/2013"
小於 字符串 "02/02/2012"
,即使它們代表的日期當然不是這樣。 如果要有意義地比較日期字符串 ,它們必須在左邊是年份,然后是月份,然后是日期。
根據您引用的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,則過濾器不會執行任何self.onlyToday()
。 我的猜測是你想要在這個過濾器功能之外進行檢查,你要么打算調用這個過濾器,要么不打算。
由於enquiry.EnquiryDate
是一個日期和時間字符串,用空格分隔,首先我們將它拆分為空格,然后我們取第一部分(日期)並將其拆分為/
。 然后我們以yy/mm/dd
順序重新組合。
現在我們知道我們可以對字符串執行===
以查看查詢日期是否等於今天。
當然,您可以使用Date
對象進行此比較,但是因為您只需要將enquiry.EnquiryDate
字符串解析為Date
對象,並且您只需要日分辨率(而不是毫秒分辨率),使用字符串比較似乎是合理的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.