Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取一个月内的周数_Javascript_Momentjs - Fatal编程技术网

Javascript 获取一个月内的周数

Javascript 获取一个月内的周数,javascript,momentjs,Javascript,Momentjs,我试图用MomentJS计算一个月内的周数。但在2015年5月和2015年8月这样的几个月里,我得到了错误的结果 我正在使用这个代码 var start = moment().startOf('month').format('DD'); var end = moment().endOf('month').format('DD'); var weeks = (end-start+1)/7; weeks = Math.ceil(weeks); 在moment JS中是否有任何预先构建的方法来获取周

我试图用MomentJS计算一个月内的周数。但在2015年5月和2015年8月这样的几个月里,我得到了错误的结果

我正在使用这个代码

var start = moment().startOf('month').format('DD');
var end = moment().endOf('month').format('DD');
var weeks = (end-start+1)/7;
weeks = Math.ceil(weeks);

在moment JS中是否有任何预先构建的方法来获取周数。

这是最好的解决方法,效果很好

moment.relativeTime.dd = function (number) {
    // round to the closest number of weeks
    var weeks = Math.round(number / 7);
    if (number < 7) {
        // if less than a week, use days
        return number + " days";
    } else {
        // pluralize weeks
        return weeks + " week" + (weeks === 1 ? "" : "s"); 
    }
}
moment.relativeTime.dd=函数(编号){
//四舍五入到最接近的周数
var weeks=数学四舍五入(数字/7);
如果(数字<7){
//如果少于一周,则使用天
返回编号+天数;
}否则{
//多周
返回周数+“周数”+(周数===1?”:“s”);
}
}

资料来源:

我创建了这个要点,可以找到给定月份和年份中的所有星期。通过计算
日历的长度
,您将知道周数


可以使用原始javascript轻松完成:

function getNumWeeksForMonth(year,month){
              date = new Date(year,month-1,1);
              day = date.getDay();
              numDaysInMonth = new Date(year, month, 0).getDate();
              return Math.ceil((numDaysInMonth + day) / 7);
}
您获得第一天的天数索引,将其添加到天数中以补偿第一周损失的天数,除以7,然后使用ceil为下周最简单的溢出添加1编辑:

新的且希望非常正确的实施:

function calcWeeksInMonth(date: Moment) {
  const dateFirst = moment(date).date(1);
  const dateLast = moment(date).date(date.daysInMonth());
  const startWeek = dateFirst.isoWeek();
  const endWeek = dateLast.isoWeek();

  if (endWeek < startWeek) {
    // Yearly overlaps, month is either DEC or JAN
    if (dateFirst.month() === 0) {
      // January
      return endWeek + 1;
    } else {
      // December
      if (dateLast.isoWeekday() === 7) {
        // Sunday is last day of year
        return endWeek - startWeek + 1;
      } else {
        // Sunday is NOT last day of year
        return dateFirst.isoWeeksInYear() - startWeek + 1;
      }
    }
  } else {
    return endWeek - startWeek + 1;
  }
}
calcWeeksInMonth(date) {
    const dateFirst = moment(date).date(1)
    const dateLast = moment(date).date(date.daysInMonth())
    const startWeek = dateFirst.week()
    const endWeek = dateLast.week()
    if (endWeek < startWeek) {
        return dateFirst.weeksInYear() - startWeek + 1 + endWeek
    } else {
        return endWeek - startWeek + 1
    }
}

旧的和非常不正确的实现:

function calcWeeksInMonth(date: Moment) {
  const dateFirst = moment(date).date(1);
  const dateLast = moment(date).date(date.daysInMonth());
  const startWeek = dateFirst.isoWeek();
  const endWeek = dateLast.isoWeek();

  if (endWeek < startWeek) {
    // Yearly overlaps, month is either DEC or JAN
    if (dateFirst.month() === 0) {
      // January
      return endWeek + 1;
    } else {
      // December
      if (dateLast.isoWeekday() === 7) {
        // Sunday is last day of year
        return endWeek - startWeek + 1;
      } else {
        // Sunday is NOT last day of year
        return dateFirst.isoWeeksInYear() - startWeek + 1;
      }
    }
  } else {
    return endWeek - startWeek + 1;
  }
}
calcWeeksInMonth(date) {
    const dateFirst = moment(date).date(1)
    const dateLast = moment(date).date(date.daysInMonth())
    const startWeek = dateFirst.week()
    const endWeek = dateLast.week()
    if (endWeek < startWeek) {
        return dateFirst.weeksInYear() - startWeek + 1 + endWeek
    } else {
        return endWeek - startWeek + 1
    }
}
calcWeeksInMonth(日期){
const dateFirst=时刻(日期)。日期(1)
const dateLast=时刻(日期).date(日期.daysInMonth())
const startWeek=dateFirst.week()
const endWeek=dateLast.week()
如果(周末

这似乎输出正确的结果,欢迎反馈,如果有什么我错过了

它用'moment.js'显示一个月内的周列表。
它是用angular 6+用typescript编写的

使用“npm i力矩”安装力矩

在ts文件中

weeks_in_month() {
    let year = 2019;  // change year
    let month = 4; // change month here
    let startDate = moment([year, month - 1])
    let endDate = moment(startDate).endOf('month');

    var dates = [];
    var weeks = [];

    var per_week = [];
    var difference = endDate.diff(startDate, 'days');

    per_week.push(startDate.toDate())
    let index = 0;
    let last_week = false;
    while (startDate.add(1, 'days').diff(endDate) < 0) {
      if (startDate.day() != 0) {
        per_week.push(startDate.toDate())
      }
      else {
        if ((startDate.clone().add(7, 'days').month() == (month - 1))) {
          weeks.push(per_week)
          per_week = []
          per_week.push(startDate.toDate())
        }
        else if (Math.abs(index - difference) > 0) {
          if (!last_week) {
            weeks.push(per_week);
            per_week = [];
          }
          last_week = true;
          per_week.push(startDate.toDate());
        }
      }
      index += 1;
      if ((last_week == true && Math.abs(index - difference) == 0) ||
        (Math.abs(index - difference) == 0 && per_week.length == 1)) {
        weeks.push(per_week)
      }
      dates.push(startDate.clone().toDate());
    }
    console.log(weeks);
}

我没有看到一个在所有情况下都有效的解决方案。我尝试了所有这些,但它们都有这样或那样的缺陷。几个moment.js github线程也是如此。这是我的破绽:

getNumberOfWeeksInMonth = (momentDate) => {
  const monthStartWeekNumber = momentDate.startOf('month').week();

  const distinctWeeks = {
    [monthStartWeekNumber]: true
  };

  let startOfMonth = momentDate.clone().startOf('month');
  let endOfMonth = momentDate.clone().endOf('month');

  //  this is an 'inclusive' range -> iterates through all days of a month
  for (let day = startOfMonth.clone(); !day.isAfter(endOfMonth); day.add(1, 'days')) {
    distinctWeeks[day.week()] = true
  }

  return Object.keys(distinctWeeks).length;
}
function weeksInMonth(日期=null){
第一天=时刻(日期).startOf('month');
让endDay=时刻(日期).endOf('month');
让周=[];

对于(让i=firstDay.week();i这里有一个简单的方法(基于):

const calcWeeksInMonth=(momentDate)=>{
const dateFirst=时刻(momentDate)。日期(1)
const dateLast=时刻(momentDate).date(momentDate.daysInMonth())
常量startWeek=dateFirst.isoWeek()
const endWeek=dateLast.isoWeek()
如果(周末

据我所知,它在任何日期都能正常工作,但欢迎反馈!

将其加入混音

import moment from "moment";
export const calcWeeksInMonth = date => {
  let weekMonthEnds = moment(date)
    .date(moment(date).daysInMonth())
    .week();
  let weekMonthStarts = moment(date)
    .date(1)
    .week();

  return weekMonthEnds < weekMonthStarts
    ? moment(date).isoWeeksInYear() - weekMonthStarts + 1
    : weekMonthEnds - weekMonthStarts + 1;
};
从“时刻”导入时刻;
导出常量calcWeeksInMonth=日期=>{
让weekMonthEnds=时刻(日期)
.date(时刻(日期).daysInMonth())
.week();
让weekMonthStarts=时刻(日期)
.日期(1)
.week();
返回weekMonthEnds
如果您选择了日期值,该值使您有机会检测当前活动的月份:

private calculateNumberOfWeeks(): number {
    const end = moment(this.selectedDate).endOf('month');

    const startDay = moment(this.selectedDate)
      .startOf('month')
      .day();

    const endDay = end.day();
    const endDate = end.date();

    return (startDay - 1 + endDate + (endDay === 0 ? 0 : 7 - endDay)) / 7;
  }

这里是javaScript版本

var year = 2021
        var  month = 6 
        var  startDate = moment([year, month])

        //Get the first and last day of the month
       var firstDay = moment(startDate).startOf('month')
       var  endDay = moment(startDate).endOf('month')
     
        //Create a range for the month we can iterate through
       var  monthRange = moment.range(firstDay, endDay)
       
        //Get all the weeks during the current month
       var  weeks = []
        var indexOf = [].indexOf;

        monthRange.by('days', function (moment) {
            var ref;
            if (ref = moment.week(), indexOf.call(weeks, ref) < 0) {
                return weeks.push(moment.week());
            }
        });
      

        var calendar, firstWeekDay, i, lastWeekDay, len, week, weekRange;

        calendar = [];

        for (i = 0, len = weeks.length; i < len; i++) {
            week = weeks[i];
            // Create a range for that week between 1st and 7th day
            firstWeekDay = moment().week(week).day(0);
            lastWeekDay = moment().week(week).day(6);
            weekRange = moment.range(firstWeekDay, lastWeekDay);
         
            // Add to the calendar
            calendar.push(weekRange);
        }
var年份=2021年
风险值月份=6
var startDate=时刻([年,月])
//得到一个月的第一天和最后一天
var firstDay=时刻(开始日期)。开始时间(月)
var endDay=时刻(起始日期)。endOf('月份')
//为我们可以迭代的月份创建一个范围
var monthRange=力矩范围(第一天,结束天)
//获取当月的所有周数
var weeks=[]
var indexOf=[].indexOf;
monthRange.by('days',函数(时刻){
var-ref;
if(ref=moment.week(),indexOf.call(weeks,ref)<0){
返回weeks.push(moment.week());
}
});
var日历,第一个工作日,i,最后一个工作日,len,week,weekRange;
日历=[];
对于(i=0,len=weeks.length;i
start
end
整数或字符串也是如此?可能的回购和??你得到了什么结果以及你期望得到什么?请注意,你需要
moment.js
moment range.js
来运行此脚本。这将在2017年12月产生不正确的结果。结果将在6周内产生,而不是5个旧线程-I w将此记录在案。如果在2017年12月运行此方法,则该方法返回2。发生这种情况的原因是,第一周(48)大于最后一周(1),即下个月的第一周。您尝试使用“first”>“last”块对此进行说明,但是,这将导致最后一周49。数学应该是:If(first>last){last=52+last}@eugene但是如果你这样做了,你还必须编辑报税表:不加1。我对吗?同样的错误:2017年12月输出6周而不是1周5@torvin我用一个更正的实现更新了我的答案。如果你有时间在某个时候验证它,那就太棒了!无论如何,感谢你对旧实现的反馈!@joruna一个关于“旧的和不正确的实现”(希望是正确的!):你的周从星期天开始,但是我们可以用你的脚本编辑到星期一吗?2020年11月返回6周,而这应该是5周
import moment from "moment";
export const calcWeeksInMonth = date => {
  let weekMonthEnds = moment(date)
    .date(moment(date).daysInMonth())
    .week();
  let weekMonthStarts = moment(date)
    .date(1)
    .week();

  return weekMonthEnds < weekMonthStarts
    ? moment(date).isoWeeksInYear() - weekMonthStarts + 1
    : weekMonthEnds - weekMonthStarts + 1;
};
var month = moment().month();
var startOfMonth = month.startOf("month");
var endOfMonth = month.endOf("month");
var startWeekNumber = startOfMonth.isoWeek();
var endWeekNumber = endOfMonth.isoWeek();
var numberOfWeeks = (endWeekNumber - startWeekNumber + 1);
console.log(numberOfWeeks);
private calculateNumberOfWeeks(): number {
    const end = moment(this.selectedDate).endOf('month');

    const startDay = moment(this.selectedDate)
      .startOf('month')
      .day();

    const endDay = end.day();
    const endDate = end.date();

    return (startDay - 1 + endDate + (endDay === 0 ? 0 : 7 - endDay)) / 7;
  }
var year = 2021
        var  month = 6 
        var  startDate = moment([year, month])

        //Get the first and last day of the month
       var firstDay = moment(startDate).startOf('month')
       var  endDay = moment(startDate).endOf('month')
     
        //Create a range for the month we can iterate through
       var  monthRange = moment.range(firstDay, endDay)
       
        //Get all the weeks during the current month
       var  weeks = []
        var indexOf = [].indexOf;

        monthRange.by('days', function (moment) {
            var ref;
            if (ref = moment.week(), indexOf.call(weeks, ref) < 0) {
                return weeks.push(moment.week());
            }
        });
      

        var calendar, firstWeekDay, i, lastWeekDay, len, week, weekRange;

        calendar = [];

        for (i = 0, len = weeks.length; i < len; i++) {
            week = weeks[i];
            // Create a range for that week between 1st and 7th day
            firstWeekDay = moment().week(week).day(0);
            lastWeekDay = moment().week(week).day(6);
            weekRange = moment.range(firstWeekDay, lastWeekDay);
         
            // Add to the calendar
            calendar.push(weekRange);
        }