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

时间:2014-02-12 19:41:46

标签: javascript jquery momentjs

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

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

13 个答案:

答案 0 :(得分:30)

似乎moment.js没有实现您正在寻找的功能的方法。 但是,您可以使用Math.ceil的{​​{1}}找到一个月中某一天的第n个数字 例如:

date / 7

看起来这是您正在寻找的号码,如以下测试所示

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:4)

简单使用moment.js

function week_of_month(date) {

        prefixes = [1,2,3,4,5];

    return prefixes[0 | moment(date).date() / 7] 

}

答案 3 :(得分:3)

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

答案 4 :(得分:2)

我认为现在响应有点晚了,但是我看不到与我相同的解决方案,因此我正在发布。

moment().weeks() - moment().add(0, 'month').startOf('month').weeks() + 1

“ moment()。weeks()”返回该年今天的周数。

“ moment()。add(0,'month')。startOf('month')。weeks()”返回该年该月第一天的周数

答案 5 :(得分:1)

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

Get week of the month

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

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

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

{{1}}

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

{{1}}

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

答案 8 :(得分:0)

如下:

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

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

答案 9 :(得分:0)

这里的Robin Malfait解决方案是由轻量级库date-fns实现的

import {
    differenceInDays,
    startOfMonth,
    startOfWeek,
    getDate
} from 'date-fns'

const weekOfMonth = function (date) {
    const firstDayOfMonth = startOfMonth(date)
    const firstDayOfWeek = startOfWeek(firstDayOfMonth)
    const offset = differenceInDays(firstDayOfMonth, firstDayOfWeek)
    return Math.ceil((getDate(date) + offset) / 7)
}

export default weekOfMonth

答案 10 :(得分:0)

我将执行以下操作:

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

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

得到todaysDateendOfLastMonth,然后使用Moment内置的diff()方法来计算当前月份的星期数。

答案 11 :(得分:0)

使用moment.js,

let count = 0;
 for (let i = 1; i <= moment().daysInMonth(); i += 7) {
      if (i < today.format('D')) {
         count += 1;
      }
     else {
       break;
     }
 };

count给出相对于月份中星期几的一天

答案 12 :(得分:0)

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

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

code的功劳归于author,如果对您有帮助,请给他一颗星。