Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 Moment.js如何获得每月的一周?(谷歌日历风格)_Javascript_Jquery_Momentjs - Fatal编程技术网

Javascript Moment.js如何获得每月的一周?(谷歌日历风格)

Javascript Moment.js如何获得每月的一周?(谷歌日历风格),javascript,jquery,momentjs,Javascript,Jquery,Momentjs,我正在使用Moment.js,它非常棒。我现在的问题是,我不知道如何把一个月的某一周定为某个特定的日期。我现在只能找到“一年中的一周”。例如,如果我选择今天的日期(2014年12月2日),我想知道这个日期是2月的第二周,因此是本月的第二个星期三。有什么想法吗 编辑: 我想有必要澄清一下。我最需要的是一个月内某一天的第n个数字。例如,(从评论中)2014年2月1日将是本月的第一个星期六。2014年2月3日将是本月的第一个星期一,尽管“技术上”是本月的第二个星期。基本上,google calenda

我正在使用Moment.js,它非常棒。我现在的问题是,我不知道如何把一个月的某一周定为某个特定的日期。我现在只能找到“一年中的一周”。例如,如果我选择今天的日期(2014年12月2日),我想知道这个日期是2月的第二周,因此是本月的第二个星期三。有什么想法吗

编辑:
我想有必要澄清一下。我最需要的是一个月内某一天的第n个数字。例如,(从评论中)2014年2月1日将是本月的第一个星期六。2014年2月3日将是本月的第一个星期一,尽管“技术上”是本月的第二个星期。基本上,google calendar的重复功能是如何对日期进行分类的。

下面的内容怎么样:

weekOfCurrentMonth = (moment().week() - (moment().month()*4));

这取一年中的当前一周,然后减去前几个月数的4倍。我认为这个问题的答案会很有帮助,即使它没有按要求使用矩.js:

函数计数WeekdayOccurrencessinMonth(日期){
var m=力矩(日期),
工作日=工作日(),
yearDay=m.dayOfYear(),
计数=0;
m、 开始日期(“月”);

而(m.dayOfYear()似乎moment.js没有实现您正在寻找的功能的方法。 但是,您可以使用
date/7的
Math.ceil
找到一个月内一周中某一天的第n个数字 例如:

var firstFeb2014 = moment("2014-02-01"); //saturday
var day = firstFeb2014.day(); //6 = saturday
var nthOfMoth = Math.ceil(firstFeb2014.date() / 7); //1

var eightFeb2014 = moment("2014-02-08"); //saturday, the next one
console.log( Math.ceil(eightFeb2014.date() / 7) ); //prints 2, as expected
看起来这就是您要查找的号码,如下面的测试所示

function test(mJsDate){
   var str = mJsDate.toLocaleString().substring(0, 3) +
             " number " + Math.ceil(mJsDate.date() / 7) +
             " of the month";
   return str;
}

for(var i = 1; i <= 31; i++) {
   var dayStr = "2014-01-"+ i;
   console.log(dayStr + " " + test(moment(dayStr)) );
}

//examples from the console:
//2014-01-8 Wed number 2 of the month
//2014-01-13 Mon number 2 of the month
//2014-01-20 Mon number 3 of the month
//2014-01-27 Mon number 4 of the month
//2014-01-29 Wed number 5 of the month
功能测试(mJsDate){
var str=mJsDate.toLocaleString().substring(0,3)+
“数字”+数学单元(mJsDate.date()/7)+
“当月最佳”;
返回str;
}
对于(var i=1;iSimple使用矩.js

function week_of_month(date) { prefixes = [1,2,3,4,5]; return prefixes[0 | moment(date).date() / 7] } 每月的功能周(日期){ 前缀=[1,2,3,4,5]; 返回前缀[0 |时刻(日期).date()/7] }
@Daniel Earwicker的答案有问题。 我在应用程序中使用了他的函数,由于以下情况,while循环是无限的:

我试图找出12月(2016)的哪一周是第31天。 十二月的第一天是一年中的第336天。十二月的最后一天是一年中的第366天

这里的问题是:当它是第366天(12月31日,一年的最后一天)时,代码在这个日期上又增加了一天。但如果再增加一天,它将是2017年1月1日。因此循环从未结束

 while (m.dayOfYear() <= yearDay) { 

    if (m.day() == weekDay) {
        count++; 
    }
    m.add('days', 1); 
}

while(m.dayOfYear()此库添加函数
moment.weekMonth()

根据给定日期计算每月的一周时,必须考虑抵消。并非所有月份都从一周的第一天开始

如果你想把这个偏移量考虑进去,如果你使用的是矩,你可以使用如下的东西

function weekOfMonth (input = moment()) {
  const firstDayOfMonth = input.clone().startOf('month');
  const firstDayOfWeek = firstDayOfMonth.clone().startOf('week');

  const offset = firstDayOfMonth.diff(firstDayOfWeek, 'days');

  return Math.ceil((input.date() + offset) / 7);
}
下面是使用轻量级库实现的解决方案

我会做以下几件事:

let todaysDate = moment(moment.now());
let endOfLastMonth = moment(get(this, 'todaysDate')).startOf('month').subtract(1, 'week');

let weekOfMonth = todaysDate.diff(endOfLastMonth, 'weeks');

这将获取今天的
endOfLastMonth
,然后使用Moment内置的
diff()
方法来计算当前月份的周数。

我根据反馈做了一些修改

let weeks = moment().weeks() - moment().startOf('month').weeks() + 1;
weeks = (weeks + 52) % 52;

在经过下一年的几天中,周值将为负值,因此我必须加上52。

它不是内置的,但基本上可以从相关日期的周数中减去月初的周数

function weekOfMonth(m) {
  return m.week() - moment(m).startOf('month').week() + 1;
}

如果信用证对你有帮助,就给他一个明星。< / P >你如何定义行为?2014年2月1日是星期六。2月3日是第一个星期,还是第二个?1月2014日,我会考虑这个月的第一个星期六。3个月2014日,我会考虑这个月的第一个星期一。ally,google calendar是如何分类的。我考虑过类似的事情,但问题是不是每个月都有4周。例如,上个月,2014年1月,有“技术上的”5周。@训练,除非你只计算整周,在这种情况下它有3周!不幸的是,你必须选择一个定义,根据这个定义,每个星期将“属于”一个特定的月份,并且没有一个一致同意的正确方法来做到这一点。你的答案和Giovanni的工作正是我需要的方式。谢谢!什么是
x.date()
?方法返回月份的日期。@skube x应该是任何momentjs对象,在本例中,它应该是2014年2月1日,我编辑了答案以消除这种混淆。在2018年7月30日不起作用。2018年7月跨越6周。上述解决方案为此日期返回5。@Shardul查看日历,看起来2018年7月实际上有5周的时间。我遗漏了什么吗?为什么不使用
date.getDate()
而不是
moment(date.date())
,moreso
2017-07-27
返回了错误的一周虽然这不能解决运营问题,但它解决了我的问题-我需要找到一个月中的一周,就像你查看日历一样,即周一->周日,其中第一个“周”可能包括上个月的几天,谢谢
时刻()之间的区别。添加(0,“月”).startOf('month').weeks()
矩().startOf('month').weeks()
,两者返回不同值时是否存在任何情况2021-12-31,返回-47作为周数
let todaysDate = moment(moment.now());
let endOfLastMonth = moment(get(this, 'todaysDate')).startOf('month').subtract(1, 'week');

let weekOfMonth = todaysDate.diff(endOfLastMonth, 'weeks');
let weeks = moment().weeks() - moment().startOf('month').weeks() + 1;
weeks = (weeks + 52) % 52;
function weekOfMonth(m) {
  return m.week() - moment(m).startOf('month').week() + 1;
}