【问题标题】:Generating a date list of the next 90 days生成未来 90 天的日期列表
【发布时间】:2016-02-11 10:08:34
【问题描述】:

我正在尝试为接下来的 90 天创建一系列日期,过滤后仅显示特定日期。因此,例如,我想要一个列表,列出未来 90 天内的所有星期二。

到目前为止,我试图简单地生成一个包含未来 90 天所有日期的数组,但它不起作用。这就是我所拥有的:​

var date = new Date();
var chckDates = [];
for (i = 0; i < 90; i++) {
    date.setDate(date.getDate() + i);
    var dmy = date.getDate() + "-" + (date.getMonth()+1) + "-" + date.getFullYear();
    chckDates.push(dmy);
}
console.log(chckDates);

从外观上看,该数组每次都会增加 n+1。例如,它增加了 1 天,然后又增加了 1 天,然后是 2 天,然后是 3... 所以我得到的日期是:11 日、12 日、14 日、17 日等。

我的两个问题是:

  1. 如何简单地让它返回未来 90 天内所有即将到来的日期的简单列表。
  2. 然后我如何过滤该数组以排除所有除了任何星期二?

谢谢

【问题讨论】:

  • 简单的列表是什么意思?
  • 每个循环只需添加 1 个
  • 为什么要创建 90 个日期然后过滤掉其中的 86%?只需从星期二开始(下一个、上一个、最近的,等等)并重复添加 7 天。

标签: javascript date


【解决方案1】:
var date = new Date();
var chckDates = [];
for (i = 0; i < 90; i++) {
    date.setDate(date.getDate() + 1);
    var dmy = date.getDate() + "-" + (date.getMonth()+1) + "-" + date.getFullYear()
    chckDates.push(dmy);
}
console.log(chckDates);

您实际上是将日期增加 1 天,然后将 i 添加到已增加的日期。 i 是指数的,因此天数呈指数增长。

我的意思是,以前你在做

date = date + 1 + i,其中 i 是 1、2、3、4。所以每次迭代日期无论如何都会增加 1,然后添加 i。只需 +1 即可。

https://jsfiddle.net/bdrnkkn9/2/

排除除周二以外的所有时间

var date = new Date();
var chckDates = [];
for (i = 0; i < 90; i++) {
    date.setDate(date.getDate() + 1);
    if(date.getDay() == 2) { // I think 2 is Tuesday, you'll have to double check this. 
        var dmy = date.getDate() + "-" + (date.getMonth()+1) + "-" + date.getFullYear()
        chckDates.push(dmy);
    }
}
console.log(chckDates);

【讨论】:

  • 不是指数增长,几何。 ;-) 此外,一旦您到达第一个星期二,您只需添加 7 天即可到达下一个星期二(是的,2 是星期二)。
  • 正确,您可以添加 7 天 @robG,但他的问题是他想过滤数组,而不是只在星期二创建一个。我刚刚意识到我的答案都没有。他要求的方式需要两个 for 循环,你的会更简单。
  • 对过滤器应用相同的逻辑:一旦找到星期二,从那时起每隔 7 个索引获取一次(假设它是一个连续的日期数组)。但我只是假设 OP 选择了一种低效的算法。
  • 他有,但我假设他需要日期数组,然后他想过滤掉这些日期以用于其他目的。
【解决方案2】:

如果您只需要星期二,则可以只生成星期二日期。下面的函数中应该有足够的文档和 cmets 供您遵循。如果您需要更多信息,请告诉我:

/*  Return an array of date strings of Tuesdays from startDate up to 
**  startDate + bound. If the start date is a Tuesday, it's not included
**
**  @param {number} bound   - number of days from startDate to collect Tuesdays
**  @param {Date} startDate - optional, the date to start from
**  @returns {Array}        - array of ISO 8601 date strings (y-m-d)
*/
function getTuesdays(bound, startDate) {
  var dates = [];
  
  // Copy start date or create a new date if not provided
  startDate = startDate? new Date(+startDate) : new Date();
  
  // Work out days to next Tuesday
  var shift = (9 - startDate.getDay())%7 || 7;
  
  // Adjust bound for shift
  bound -= shift;
  
  // Adjust startDate for shift
  startDate.setDate(startDate.getDate() + shift);
  
  // Generate dates, increment date and decrement bound
  while (bound >= 0) {
    dates.push(toLocalISODate(startDate));
    startDate.setDate(startDate.getDate() + 7);
    bound -= 7;
  }
  return dates;
}

function toLocalISODate(d) {
  return d.getFullYear() + '-' + ('0'+(d.getMonth()+1)).slice(-2) + '-' + ('0'+d.getDate()).slice(-2);
}

// Get Tuesdays in the next 18 days
document.write(getTuesdays(18).join('<br>'));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2021-12-22
    • 2020-12-24
    • 1970-01-01
    相关资源
    最近更新 更多