Javascript 获取未来三个月的星期日列表

Javascript 获取未来三个月的星期日列表,javascript,Javascript,我需要一份未来三个月的星期日清单。我写了一个函数,一直工作到今天。从今天开始的三个月是一月,也就是0,所以我的for循环不起作用 function getSundays(year) { const offdays = []; let i = -1; const currentDate = new Date(); currentDate.setDate(currentDate.getDate() + 90); for ( let month = new Date().getMo

我需要一份未来三个月的星期日清单。我写了一个函数,一直工作到今天。从今天开始的三个月是一月,也就是0,所以我的for循环不起作用

function getSundays(year) {
  const offdays = [];
  let i = -1;
  const currentDate = new Date();
  currentDate.setDate(currentDate.getDate() + 90);
  for ( let month = new Date().getMonth(); month < currentDate.getMonth(); month += 1) {
    const tdays = new Date(year, month, 0).getDate();
    for (let date = 1; date <= tdays; date += 1) {
      const smonth = (month < 9) ? `0${month + 1}` : month + 1;
      const sdate = (date < 10) ? `0${date}` : date;
      const dd = `${year}-${smonth}-${sdate}`;
      const day = new Date();
      day.setDate(date);
      day.setMonth(month);
      day.setFullYear(year);
      if (day.getDay()  ===  0 ) {
        offdays[i += 1] = dd;
      }
    }
  }
  return offdays;
}
函数getSundays(年){
常闭日=[];
设i=-1;
const currentDate=新日期();
currentDate.setDate(currentDate.getDate()+90);
对于(月份=新日期().getMonth();月份<当前日期.getMonth();月份+=1){
const tdays=新日期(年、月、0).getDate();

对于(让date=1;date请测试下面的代码)

var startDate=新日期(2018,0,1);
var endDate=新日期(2018年11月31日);
var日=0;
对于(i=0;i m.format('LLLL'));
console.log(result.map(m=>m.format('YYYY-MM-DD'));

假设每月大约有4个星期天

函数getSundays(){ 常数星期日=[]; var sunday=新日期() sunday.setDate(sunday.getDate()+7-sunday.getDay()); 对于(变量i=0;i<12;i++){ console.log(sunday.tolocalString()); sundays.push(新日期(sunday.getTime()); sunday.setDate(sunday.getDate()+7); } 星期日返回; }
getSundays();
如果您想要一种基于非momentjs的方法,也许您可以这样做

此方法一次递增一天,在未来三个月内继续,并查找
getDay()==0
(即星期日)的任何日期实例

增量是通过
毫秒
完成的,这是一种为特定日期/月/年创建日期对象的方便方法。月计数器跟踪
当前日期
下一个日期
之间的月/年变化,以确定是否应增加月计数器:

函数getSundays(年){
var start=新日期();
开始。设置年份(年);
var startEpoch=start.valueOf();
var dayDuration=86400000;//一天中的毫秒数
var currentEpoch=startEpoch;
var offdays=[];
//根据需要从开始迭代三个月
对于(var monthCounter=0;monthCounter<3;){
var currentDate=新日期(currentEpoch);
var nextDate=新日期(当前历元+日持续时间);
//如果下个月或下一年从
//当前月份或年份,然后递增月份计数器
如果(nextDate.getMonth()>currentDate.getMonth()||
nextDate.getYear()>currentDate.getYear()){
monthCounter++;
}
如果(currentDate.getDay()==0){
offdays.push(当前日期);
}
currentEpoch+=日持续时间;
}
休息日返回;
}

console.log(getSundays(2018).map(date=>date.toString());
您可以使用date get | setMonth和get | setDay的方法进行设置,例如:

const next=新日期()
next.setMonth((新日期()).getMonth()+1)
康斯特所有星期日=[]
const sundaysByMonth=[]

对于(让我=0;我看了一些已经给出的答案,它们似乎很接近,激发了我在不使用moment.js的情况下进行拍摄的灵感-大量评论,希望能够解释它,但它有助于我对问题的理解,尽管您可能需要为您的目的塑造
结果
值,但它包含您需要的内容需要,我相信

函数GetSundaySforNextCalendarmons(numberOfMonths,dateVal){ 让trackingObj={};//我们将使用此对象在循环中按月跟踪trackingObj。 让result=[];//我们将在这里推送每次迭代的日期,而不是在本例的结果上创建映射函数。无论如何,这可能有些过分,此数组不应包含超过15天的时间 如果(!dateVal){ dateVal=new Date();//将日期初始化为今天或从哪里开始 } //在循环的第一次使用今天的日期作为参考,我们会找出它离星期天有多远,然后在UNIX时间中添加一天中时间(以毫秒为单位)的差值 //但首先,我们还将时间设置为凌晨2点,以避免夏令时在一段时间内出现上下移动的情况 dateVal.setHours(2); dateVal.setTime(dateVal.getTime()+(7-dateVal.getDay())*(24*60*60*1000));//在星期日之后将dateVal改为现在相等 push(dateVal.toDateString()); //理论上,这个循环在迭代之前会中断,因为在3个月内你不会有15个星期天,但是我删除了while循环,因为它更容易确定循环的运行时间 对于(设i=0;i控制台日志(GetSundaySforNextCalendarmons(3))
为什么要使用
const
?@Raptor它没有被重新分配,将其更改为let不会改变结果对于这样的事情,您可能会发现使用适当的日期库更容易,例如矩。JS@Raptor这有一个lint规则。知道某些东西不会被重新分配可以使遵循代码更容易,或者正如链接所解释的
const declaration告诉读者,“这个变量永远不会被重新分配”,从而减少认知负载并提高可维护性。
你能帮助我们理解这个问题是如何衡量“未来三个月的星期日”的吗?这是一个很好的警告,MomentJS的日期非常棒,但它也是一个大库,最新版本是64.2K缩小版和gzip