簡體   English   中英

在瞬間范圍內尋找leap年

[英]Finding leap years in a moment-range

我正在嘗試使用moment.js和moment-range來確定給定的日期范圍是否包含year年和a日(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返回false,因為dateRange.toArray('years')僅包含一個元素,即僅包含2015年。

解決此問題的最佳方法是什么?

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

您說對了,因為沒有簡單的方法可以在瞬間完成此操作。 維護人員很樂意接受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中的示例不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM