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

我正在使用Moment.js,这很棒。 我现在遇到的问题是,我无法弄清楚如何获得某个特定日期的月份。 我只能在Moment js docs中找到“一年中的一周”。 例如,如果我选择今天的日期(2014年12月2日),我想知道这个日期是在本月的第二个星期,因此,它是本月的第二个星期三。 有任何想法吗?

编辑:我想有些澄清是必要的。 我最需要的是一个月中某一天的第n个数字。 例如,(来自评论)2014年2月1日将是该月的第一个星期六。 2014年2月3日将是本月的第一个星期一,尽管它在技术上是本月的第二周。 基本上,谷歌日历的重复function究竟如何分类天。

似乎moment.js没有实现您正在寻找的function的方法。 但是,您可以使用date / 7Math.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 

简单使用moment.js

 function week_of_month(date){

        前缀= [1,2,3,4,5];

    返回前缀[0 | 时刻(日期)。日期()/ 7] 

 }

在根据给定日期计算月中的星期时,您必须考虑偏移量。 并非所有月份都在一周的第一天开始。

如果您想考虑这个偏移量,如果您正在使用时刻,可以使用类似下面的内容。

 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); } 

这个库添加了函数moment.weekMonth() https://github.com/c-trimm/moment-recur

我认为这个问题的答案会有所帮助,即使它没有按要求使用moment.js:

获得一个月的一周

 function countWeekdayOccurrencesInMonth(date) { var m = moment(date), weekDay = m.day(), yearDay = m.dayOfYear(), count = 0; m.startOf('month'); while (m.dayOfYear() <= yearDay) { if (m.day() == weekDay) { count++; } m.add('days', 1); } return count; } 

@Daniel Earwicker答案存在问题。 我在我的应用程序中使用了他的函数,而while循环是无限的,因为以下情况:

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

问题在于:当它是第366天(12月31日,一年的最后一天)时,代码又增加了一天到此日期。 但是另外一天又增加了它将是2017年1月的第1天。因此循环永远不会结束。

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

我在代码中添加了以下行,以便修复问题:

 function countWeekdayOccurrencesInMonth(date) { var m = moment(date), weekDay = m.day(), yearDay = m.dayOfYear(), year = m.year(), count = 0; m.startOf('month'); while (m.dayOfYear() <= yearDay && m.year() == year) { if (m.day() == weekDay) { count++; } m.add('days', 1); } return count; } 

它validation它是否仍然在被修改的同一年

怎么样的:

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

这需要一年中的当前一周,并将其减去前几个月的4倍。 哪个应该给你当月的一周