2015-11-11 83 views
2

我想在沒有時間部分的情況下比較javascript中的兩個日期。第一個日期來自jquery datepicker,第二個日期來自一個字符串。Javascript - 比較沒有時間的日期

儘管我可以發誓我的方法工作了一段時間,但看起來它現在不工作。

我的瀏覽器是Firefox,但我也需要我的代碼才能在IE中工作。

function selectedDateRetentionDaysElapsed() { 
    var dateSelectedDate = $.datepicker.parseDate('dd/mm/yy', $('#selectedDate').val()); 
    // dateSelectedDate is equal to date 2015-09-30T14:00:00.000Z 

    var parsedRefDate = isoStringToDate('2015-11-10T00:00:00'); 
    var reportingDate = getPredfinedDateWithoutTime(parsedRefDate); 
    // reportingDate is equal to date 2015-11-10T13:00:00.000Z 

    var businessDayCountFromCurrentReportingDate = getBusinessDayCount(dateSelectedDate,reportingDate); 
    // businessDayCountFromCurrentReportingDate is equal to 39.9583333333336 

    if (businessDayCountFromCurrentReportingDate >= 40) { 
     return true; 
    }  
    return false; 
} 

function isoStringToDate(dateStr) { 
    var str = dateStr.split("T"); 
    var date = str[0].split("-"); 
    var time = str[1].split(":"); 

    //constructor is new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]); 
    return new Date(date[0], date[1]-1, date[2], time[0], time[1], time[2], 0); 
} 

function getPredfinedDateWithoutTime(myDate) { 
    myDate.setHours(0,0,0,0) 
    return myDate; 
} 

我的問題是...

  1. 我isoStringToDate函數返回與即使我不指定時間的日期。
  2. 在一個日期的setHours調用似乎也沒有工作。

有人可以幫助我這個。

+0

1.您指定的時間。您解析一個字符串,將值提取到'time'數組,然後將其傳遞給構造函數。 –

+0

沒有辦法將'2015-11-10T00:00:00'轉換爲Date對象相當於'2015-09-30T13:00:00.000Z',這些日期相隔41天。另外,* isoStringToDate *函數爲**本地**小時零,所以除非您處於GMT時區,即UTC(即Z)時區,否則時間組件不會爲00:00:00。 – RobG

+0

嗨,葉爾達。這是真的,但時間值是00:00:00。那麼,沒有時間,這不是一個有效的日期嗎? – Richie

回答

3

獲取兩個日期之間的整天數的最簡單方法是爲設置爲同一時間的主題日期創建兩個日期對象。中午是方便的,因爲它意味着日期部分不受夏令時的影響(有些地方在午夜介紹它),如果您恰好打印出日期部分。

以下內容將在主機系統的時區進行所有計算。 UTC可以使用(並且小時數設置爲0,因爲夏令時根本不是問題),但是輸入更多。

例如爲:

function differenceInDays(d0, d1) { 
 
    // Copy dates so don't affect originals 
 
    d0 = new Date(+d0); 
 
    d1 = new Date(+d1); 
 

 
    // Set to noon 
 
    d0.setHours(12,0,0,0); 
 
    d1.setHours(12,0,0,0); 
 

 
    // Get difference in whole days, divide by milliseconds in one day 
 
    // and round to remove any daylight saving boundary effects 
 
    return Math.round((d1-d0)/8.64e7) 
 
} 
 

 
// Difference between 2015-11-12T17:35:32.124 and 2015-12-01T07:15:54.999 
 
document.write(differenceInDays(new Date(2015,10,12,17,35,32,124), 
 
           new Date(2015,11,01,07,15,54,999)));

+0

謝謝你。這是一個很好的功能。我對你在日期複製中使用加號運算符的地方有點困惑。從我讀過的東西,我認爲你是使用加號運算符將輸入日期轉換爲數字,但是當我看看js文檔時,我看不到數字 – Richie

+0

@ Richie的新日期構造函數 - 直到ES5,如果Date對象作爲唯一值傳遞給Date構造函數,它首先被轉換爲一個字符串,然後解析回Date對象。有些瀏覽器在某些情況下錯誤地解析了字符串(不管是否相信),所以使用'+ date'將Date轉換爲數字更安全,從而傳遞時間值並確保副本的準確性。但是,自ES5以來,Date值被轉換爲時間值(實際上與'+ date'相同,參見[* Date(value)*](http://ecma-international.org/ecma-262/6.0 /index.html#sec-date-value))。 – RobG