Момент.js как получить неделю месяца? (стиль календаря google)



Я использую момент.js и это здорово. Проблема у меня сейчас в том, что я не могу понять, как получить неделю месяца с определенной датой. Я могу найти только "неделю года" в момент JS docs. Например, если я выберу сегодняшнюю дату (2/12/2014), я хотел бы знать, что эта дата находится во второй неделе этого месяца февраля и, следовательно, это вторая среда месяца. Есть идеи?



Править:
Я думаю, что некоторые разъяснения необходимы. Больше всего мне нужно энное число определенного дня в месяце. Например, (из комментариев) 1 февраля 2014 года будет первой субботой месяца. 3 февраля 2014 года будет первым понедельником месяца, хотя это "технически" вторая неделя месяца. В принципе, именно так функция повтора Google calendar классифицирует дни.

631   8  

8 ответов:

Кажется, что именно в этот момент.js не имеет метода, который реализует функциональность, которую вы ищете. Однако вы можете найти n-е число определенного дня недели в месяце, используя Math.ceil из 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

Похоже, что это число, которое вы ищете, как показано в следующем тесте

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

Простое использование момента.js

function week_of_month(date) {

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

    return prefixes[0 | moment(date).date() / 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

Я думаю, что ответ на этот вопрос будет полезен, даже если он не использует момент.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 был бесконечным из-за следующей ситуации:

Я пытался выяснить, какая неделя декабря (2016) была днем 31. первый день декабря был днем 336 года. Последний день декабря был днем 366 года.

Проблема здесь: когда это был день 366 (31 декабря, последний день года), код добавил еще один день к этой дате. Но с другим днем добавлено, что это будет день 1 января 2017 года. Поэтому цикл никогда не заканчивался.

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

Он проверяет, находится ли он по-прежнему в том же году, что и дата проверки

Как насчет чего-то вроде:

weekOfCurrentMonth = (moment().week() - (moment().month()*4));
Это берет текущую неделю года и вычитает ее в 4 раза больше числа предыдущих месяцев. Который должен дать вам неделю текущего месяца

Comments

    Ничего не найдено.