2017-06-16 84 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中的示例不同。