web-dev-qa-db-ja.com

Moment.jsで月の週を取得する方法は? (Googleカレンダースタイル)

私はMoment.jsを使用しています。今私が抱えている問題は、特定の日付の月の週を取得する方法を理解できないことです。 「年の週」はモーメントjsドキュメントでしか見つかりません。たとえば、今日の日付(2014年2月12日)を選択した場合、この日付は2月の今月の第2週であり、その結果、その月の第2水曜日です。何か案は?

編集:私はいくつかの説明が必要だと思います。最も必要なのは、月の特定の日のn番目の数です。たとえば、(コメントから)2014年2月1日はその月の最初の土曜日になります。 「技術的に」月の第2週であるにもかかわらず、2014年2月3日はその月の第1月曜日になります。基本的には、Googleカレンダーの繰り返し機能が日を分類する方法とまったく同じです。

17
train

Moment.jsには、探している機能を実装するメソッドがないようです。ただし、月の特定の曜日のn番目の数値は、Math.ceildate / 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
32

特定の日付に基づいて月の週を計算するときは、オフセットを考慮する必要があります。すべての月が週の最初の日から始まるわけではありません。

このオフセットを考慮に入れたい場合、モーメントを使用している場合は次のようなものを使用できます。

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);
}
11
Robin Malfait

Moment.jsを使用して簡単に

関数week_of_month(日付){
 
プレフィックス= [1,2,3,4,5]; 
 
プレフィックスを返す[0 | moment(date).date()/ 7] 
 
} 
5

このライブラリは、関数moment.weekMonth()https://github.com/c-trimm/moment-recur を追加します

3
Keith Holliday

返答は少し遅いと思いますが、私と同じ解決策が見当たらないので投稿します。

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

「moment()。weeks()」は、その年内のtodayの週数を返します。

「moment()。add(0、 'month')。startOf( 'month')。weeks()」は、その年の月の最初の日の週数を返します。

3
R.Cha

@Daniel Earwickerの回答に問題があります。私は自分のアプリケーションで彼の関数を使用しており、次の状況のた​​めにwhileループは無限大でした。

12月のどの週(2016年)が31日かを調べようとしていました。12月の最初の日はその年の336日です。 12月の最終日は、今年の366日目です。

ここでの問題:それが366日(12月31日、その年の最後の日)だったとき、コードはこの日付に別の日を追加しました。しかし、もう1日追加すると、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;
}

それは非常にファイフされている日付の同じ年にまだあるかどうかを確認します

1
Michelle Colin

この質問への回答は、リクエストに応じてmoment.jsを使用していなくても役立つと思います。

月の週を取得

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

次のようなものはどうですか:

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

これは、その年の現在の週を取り、それを前の月の数の4倍減算します。現在の月の週が表示されます

0
Mitch Dempsey

次のようにします。

_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()メソッドを使用して現在の月の週番号を計算します。

0
Eric Hubbell

これが 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
0
Klemen Tušar