2017-06-16 116 views
0

我試圖使用moment.js和時間範圍來確定給定的日期範圍是否包含閏年和閏年(2月29日)。在瞬間範圍內尋找閏年

// Really checks for leap day, not only leap year. 
function dateRangeContainsLeapYear(dateRange) { 
    return dateRange.toArray('years').some((year) => { 
    return year.isLeapYear() && dateRange.contains(moment([year.year(), 1, 29])); 
    }); 
} 

// Scenario 1 
var start = moment('2015-07-01', 'YYYY-MM-DD'); 
var end = moment('2016-06-30', 'YYYY-MM-DD'); 

var dateRange = moment().range(start, end); 
var dateRangeLength = dateRange.toArray('days').length; // 366 

var output = dateRangeContainsLeapYear(dateRange); 
console.log(output); // false 

// Scenario 2 
var start = moment('2015-07-01', 'YYYY-MM-DD'); 
var end = moment('2016-07-01', 'YYYY-MM-DD'); 

var dateRange = moment().range(start, end); 
var dateRangeLength = dateRange.toArray('days').length; // 367 

var output = dateRangeContainsLeapYear(dateRange); 
console.log(output); // true 

// Scenario 3 
var start = moment('2016-01-01', 'YYYY-MM-DD'); 
var end = moment('2016-06-30', 'YYYY-MM-DD'); 

var dateRange = moment().range(start, end); 
var dateRangeLength = dateRange.toArray('days').length; // 182 

var output = dateRangeContainsLeapYear(dateRange); 
console.log(output); // true 

// Scenario 4 
var start = moment('2015-07-01', 'YYYY-MM-DD'); 
var end = moment('2017-06-30', 'YYYY-MM-DD'); 

var dateRange = moment().range(start, end); 
var dateRangeLength = dateRange.toArray('days').length; // 731 

var output = dateRangeContainsLeapYear(dateRange); 
console.log(output); // true 

方案1爲假爲dateRange.toArray('years')僅包含一個元素,即只有2015年

什麼是解決它的最好方法?

的jsfiddle:https://jsfiddle.net/wwwescape/es931aa5/

+0

你不想只檢查二十九嗎? – vassiliskrikonis

+0

我如何檢查該範圍內的特定年份? –

回答

0

你在,有沒有簡單的方法矩範圍內做到這一點是對的。維護人員很樂意接受PR來解決這樣的問題,即可以在range.by()方法中添加一個標記,以允許包含非整年/月/日。

我發現一個相當優雅的解決方案,它解決了使用一個簡單的循環您的問題:

function dateRangeContainsLeapYear(dateRange) { 
    for (var year = dateRange.start.year(); year <= dateRange.end.year(); year++) { 
    var date = moment(year + '-02-29'); 
    if (date.isLeapYear() && dateRange.contains(date)) return true; 
    } 
    return false; 
} 

PS。確保你更新你的時刻版本!轉換爲數組與您在API中的示例不同。