簡體   English   中英

在Javascript中比較日期字符串

[英]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應該被過濾,因為它今天沒有創建。

這里有幾個問題。

  1. 你正在formatted一個字符串,然后使用+formatted > -1 +formatted將永遠是NaN ,它永遠不會> -1 (它也永遠不會等於-1而且永遠不會< -1 )。

  2. 您將include設置為true ,然后執行include = include && ... &&永遠不會被評估,因為&&左邊的部分是true而JavaScript(像大多數現代語言一樣)是短路表達式。

  3. 如果enquiry是指對象,則+enquiry可能是NaN除非您已覆蓋其valueOf

  4. 您正在比較字符串 ,這意味着比較的最重要部分將位於左側 - 但您的日期字符串采用的格式是最重要的值在右側 因此,例如, 字符串 "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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM