2017-04-25 106 views
2

我正在嘗試爲dataTables開發自定義日期範圍過濾器。用戶可以在兩個輸入中輸入開始日期和結束日期,並過濾整個表格。在JavaScript中比較新日期失敗

輸入開始日期和結束日期時,結果相符。當我只輸入其中一個時,結果失敗。例如;起始日期是2017年12月1日,但我可以看到實例與日期29-11-2016 ...我的過濾代碼:

$('#filter').on('click', function(e) { 
      e.preventDefault(); 
      var startDate = $('#start').val(), 
       endDate = $('#end').val(); 

      filterByDate(10, startDate, endDate); // We call our filter function 

      $dTable.dataTable().fnDraw(); // Manually redraw the table after filtering 
     }); 

     var filterByDate = function(column, startDate, endDate) { 
      $.fn.dataTableExt.afnFiltering.push(
       function(oSettings, aData, iDataIndex) { 
        var rowDate = normalizeDate(aData[10]), 
         start = normalizeDate(startDate), 
         end = normalizeDate(endDate); 


        // If our date from the row is between the start and end 
        if (start <= rowDate && rowDate <= end) { 
         console.log(start <= rowDate); 
         return true; 
        } else if (rowDate >= start && end === '' && start !== ''){ 
         console.log(rowDate >= start && end === '' && start !== ''); 
         return true; 
        } else if (rowDate <= end && start === '' && end !== ''){ 
         return true; 
        } else { 
         return false; 
        } 
       } 
      ); 
     }; 

     var normalizeDate = function(dateString) { 
      var date = new Date(dateString); 
      var normalized = ("0" + date.getDate()).slice(-2) + '/'+ (("0" + (date.getMonth() + 1)).slice(-2)) + '/' +date.getFullYear() ; 
      return normalized; 
     }; 

可能一些JavaScript天才幫助我獲得的rowData >= start....比較和rowDate <= end....工作正常嗎?輸入日期由/分隔,在我的表格中由/分隔,但normalizeData函數使它們具有相同的佈局。

+0

什麼是* dateString *的價值?在使用Date構造函數解析字符串之前,請考慮[*爲什麼Date.parse會給出不正確的結果*](http://stackoverflow.com/questions/2587345/why-does-date-parse-give-incorrect-results)。 – RobG

回答

1

您可以使用以下兩個日期比較!

在本例中,您使用UNIX時間戳來比較兩個日期。

if ((new Date(startDate).getTime() > new Date(endDate).getTime())) { 
    // start date is greater than end date 
} 

if ((new Date(startDate).getTime() < new Date(endDate).getTime())) { 
    // start date is lower than end date 
} 

工作片斷:

var startDate = document.getElementById('start').value; 
 
var endDate = document.getElementById('end').value; 
 

 
if ((new Date(startDate).getTime() > new Date(endDate).getTime())) { 
 
    console.log("start date is greater than end date") 
 
} 
 

 
if ((new Date(startDate).getTime() < new Date(endDate).getTime())) { 
 
    console.log("start date is lower than end date") 
 
}
<input id="start" value="10/10/2017"/> 
 
<input id="end" value="12/10/2017"/>

+0

請不要推薦使用Date構造函數解析字符串,它充其量是有問題的。應該使用一個真正的解析器,一個庫或簡單的(可能是3行)函數。 * getTime *返回的值是[*時間值*](http://www.ecma-international.org/ecma-262/7.0/index.html#sec-time-values-and-time-range) ,這是毫秒。 「UNIX時間戳」是秒,雖然它使用與ECMAScript相同的紀元(它由許多系統和語言(如Java)共享)。 – RobG

+1

我知道這個問題,我會稍後更新答案和.split()字符串,並在去日期之後..感謝您的建議:) – Felix

1

這裏有一個想法:

將您dates爲Unix時間戳和比較這些來代替。您可以使用date.getTime()來執行此轉換。

如slezica上下面的評論說:

getTime()返回自1970年1月1日0小時毫秒的量。這是一個你可以比較的簡單數字。

例子:

var date1 = new Date(1995, 11, 17); 
 
var date2 = new Date(2005, 12, 25); 
 

 
if (date2.getTime() > date1.getTime()) { 
 
    console.log("date 2 is later than date 1"); 
 
}