Момент.js как получить неделю месяца? (стиль календаря google)
Я использую момент.js и это здорово. Проблема у меня сейчас в том, что я не могу понять, как получить неделю месяца с определенной датой. Я могу найти только "неделю года" в момент JS docs. Например, если я выберу сегодняшнюю дату (2/12/2014), я хотел бы знать, что эта дата находится во второй неделе этого месяца февраля и, следовательно, это вторая среда месяца. Есть идеи?
Править:
Я думаю, что некоторые разъяснения необходимы. Больше всего мне нужно энное число определенного дня в месяце. Например, (из комментариев) 1 февраля 2014 года будет первой субботой месяца. 3 февраля 2014 года будет первым понедельником месяца, хотя это "технически" вторая неделя месяца. В принципе, именно так функция повтора Google calendar классифицирует дни.
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
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; }Он проверяет, находится ли он по-прежнему в том же году, что и дата проверки
Как насчет чего-то вроде:
Это берет текущую неделю года и вычитает ее в 4 раза больше числа предыдущих месяцев. Который должен дать вам неделю текущего месяцаweekOfCurrentMonth = (moment().week() - (moment().month()*4));
Comments