2014-12-08 55 views
-1

我想獲得給定範圍的日期的假期。如何在我的情況下獲得假期日期?

例如:

var holiday = ['2014-01-01','2014-07-04','2014-12-24', '2014-12-25'...other holidays elements ]; 

var startDate = '2014-08-01' 
var endDate = '2014-12-30'; 

var holidays=getHolidays(startDate, endDate); 
//console.log(holidays) -> output 2014-12-24 and 2014-12-25. 

getHolidays = function(startDate, endDate) { 
    var holidays=[]; 
    //not sure how to get holidays here.... 
    return holidays 
} 

我希望寫一個函數來獲取情節中字和情節中字。我的大腦現在被炸,我不知道這是什麼最好的方法。任何人都可以幫助我嗎?非常感謝!

+1

getHolidays()是什麼意思?你的問題相當模糊(實際上,你的問題是什麼?)。 – orange 2014-12-08 02:20:20

+0

該函數可以返回假期列表。我不知道從哪裏開始,所以我沒有在裏面放任何東西。 – BonJon 2014-12-08 02:24:12

回答

3

解決方法是使用數組的過濾函數。第一個參數是你需要過濾的數組,在你的情況下,它是['2014-01-01','2014-07-04','2014-12-24','2014-12-25'] 。

var getHolidays = function(holiday,startDate, endDate) { 
    return holiday.filter(function(element){ 
     var start = new Date(startDate); 
     var end = new Date(endDate); 
     var temp = new Date(element); 
     return temp >= start && temp <= end; 
    }); 
} 

var holiday = ['2014-01-01', '2014-07-04', '2014-12-24', '2014-12-25']; 
var startDate = '2014-08-01' 
var endDate = '2014-12-30'; 
var holidays = getHolidays(holiday,startDate, endDate); //["2014-12-24", "2014-12-25"] 

它的工作原理完全按照你的期望在 JSFiddle

1

您可以嘗試將它們轉換爲日期對象,然後以這種方式進行比較。例如:

var holidays = ['2014-01-01','2014-07-04','2014-12-24', '2014-12-25']; 

var startDate = '2014-08-01'; 
var endDate = '2014-12-30'; 

var getHolidays = function(startDate, endDate) { 
    var startTime = new Date(startDate).getTime(); 
    var endTime = new Date(endDate).getTime(); 
    var output = []; 

    holidays.forEach(function(holiday) { 
     var holidayTime = new Date(holiday).getTime(); 

     if (holidayTime >= startTime && holidayTime <= endTime) { 
      output.push(holiday); 
     } 
    }); 

    return output; 
} 


var holidays = getHolidays(startDate, endDate); 

console.log(holidays); 
+0

謝謝!你能解釋一下假日變量是什麼嗎? +1 – BonJon 2014-12-08 02:26:29

+0

我把你原來的假期日期列表放到一個名爲'holidays'的數組中。與'forEach'一致的'holiday'變量是自動傳入的參數。有關更多信息,請參閱https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach細節。 – chinabuffet 2014-12-08 02:34:29

+0

請不要使用Date構造函數來解析字符串,它至多不可靠。使用簡單的解析函數。 – RobG 2014-12-08 03:05:21

0

爲純弦所示,getHolidays功能可以是:

// Get holidays between two dates 
function getHolidays(startDate, endDate) { 
    var output = []; 
    var i = 0; 
    var holiday; 

    while ((holiday = holidays[i++]) && holiday < endDate) { 
    if (startDate <= holiday) { 
     output.push(holiday) 
    } 
    } 
    return output; 
} 

如果您正在使用ISO 8601的日期字符串,不需要將它們轉換爲Date對象。 ISO格式的一個原因是,在大多數系統中,您可以直接比較字符串而不是日期對象或某個數字值。

您也可以解析字符串Date對象,然後使用這些做計算,但它需要更多的代碼沒有真正的好處:

// Parse date string in y-m-d format 
function parseYMD(s) { 
    var b = s.split(/\D/); 
    var d = new Date(); 
    d.setHours(0,0,0,0); 
    d.setFullYear(b[0], --b[1], b[2]); 
    return d.getFullYear() == b[0] && d.getDate() == b[2]? d : NaN; 
} 

// Holiday array 
var holidays = ['2014-01-01','2014-07-04','2014-12-24', '2014-12-25']; 

// Get holidays between two dates 
function getHolidays(startDate, endDate) { 
    startDate = parseYMD(startDate); 
    endDate = parseYMD(endDate); 
    var output = []; 
    var i = 0; 
    var holiday; 

    for (var i=0, iLen=holidays.length; i<iLen; i++) { 
    holiday = parseYMD(holidays[i]); 

    if (holiday <= endDate) { 
     if (holiday >= startDate) { 
     output.push(holidays[i]); 
     } 
    } 
    } 
    return output; 
} 

console.log(getHolidays('2014-08-01', '2014-12-30')); // ["2014-12-24", "2014-12-25"] 
0

這不是緊湊其他兩個解決方案,但他們分享相同的邏輯。 您可以使用排序的一組日期來存儲您的假期。

所以您的解決方案應該是這樣:

var holiday = [new Date('2014-01-01'), new Date('2014-07-04'),new Date('2014-12-24'), new Date('2014-12-25')]; 
var startDate = new Date('2014-08-01'); 
var endDate = new Date('2014-12-30'); 

function getHolidays(start, end){ 
    //create and initialize a SortedSet object 
    var holidays = new SortedSet(holiday); 
    var startIndex = holidays.bisect_left(startDate); 
    var endIndex = holidays.bisect_left(endDate); 
    return holidays.getSubSet(startIndex, endIndex).toArray(); 
} 

//utility function to get the date as a string in the preferred format 
function dateToMyString(date){ 
    return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); 
} 

//get array of dates 
var h = getHolidays(startDate, endDate); 

//convert to array of strings 
h.forEach(function(date, index, array){ 
    h[index] = dateToMyString(date); 
}); 

現在的SortedSet可能是這個樣子(這是上午6:00,所以我可以在這裏犯了一個錯誤:)):

function SortedSet(arr){ 
    var set = new Array(); 

    //gets insertion position for item 
    this.bisect_left = function(item){ 
     var length = set ? set.length : -1; 
     var l = 0, r = length, p; 

     if(r < 1){ 
      return -1; 
     } 

     while(r > l){ 
      p = parseInt(l + (r - l)/2); 

      if (set[p] < item){ 
       l = p + 1; 
      } else { 
       r = p; 
      } 
     } 
     return l; 
    }; 

    //adds element to set in sorted order 
    this.add = function(item){ 
     var pos = this.bisect_left(item); 

     if(pos === -1 || pos === set.length){ 
      set.push(item); 
      return; 
     } 

     if (set[pos] === item){ 
      return; 
     } 

     set.splice(pos, 0, item); 
    }; 

    //gets item at given index 
    this.at = function(index){ 
     return set[index]; 
    }; 

    //returns subset 
    this.getSubSet = function(startIndex, endIndex){ 
     return new SortedSet(set.slice(startIndex, endIndex)); 
    }; 

    //returns the set var 
    this.toArray = function(){ 
     return set; 
    } 

    //initialize the set array 
    if(arr && arr instanceof Array){ 
     for(var i = arr.length; i--;){ 
      this.add(arr[i]); 
     } 
    } 
} 
相關問題