Javascript 获取一个月内的周数
我试图用MomentJS计算一个月内的周数。但在2015年5月和2015年8月这样的几个月里,我得到了错误的结果 我正在使用这个代码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中是否有任何预先构建的方法来获取周
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);
}