web-dev-qa-db-ja.com

Moment.js-isoWeekday()で月曜日の週を開始

週を表形式で印刷するカレンダーを作成しています。 1つの要件は、一部のユーザーオプションに従って、月曜日または日曜日のいずれかに週を開始できることです。モーメントの isoWeekday メソッドを使用するのに苦労しています。

// Start of some date range. Can be any day of the week.
var startOfPeriod = moment("2013-06-23T00:00:00"),

    // We begin on the start of the first week.
    // Mon Tues Wed Thur Fri Sat Sun
    // 20  21   22  23   24  25  26
    begin = moment(startOfPeriod).isoWeekday(1); // will pull from user setting

console.log(begin.isoWeekday()); // 1 - all good

// Let's get the beginning of this first week, respecting the isoWeekday
begin.startOf('week');

console.log(begin.isoWeekday()); // 7 - what happened ???

// Get column headers
for (var i=0; i<7; i++) {
    console.log(begin.format('ddd')); // I want Monday first!
    begin.add('d', 1);
}

jsFiddle

EDITisoWeekdayが実際に行っていることを誤解しました。 「どの曜日が週の最初の日であるか」変数を設定すると思いました(それは存在しません)。実際に行われるのは、moment.weekday()と同様に曜日を変更するだけですが、0-6ではなく1-7の範囲を使用します。

99
savinger

begin.startOf('isoWeek');の代わりにbegin.startOf('week');を使用してみてください

204
tetri

startOfの前にisoWeekdayを呼び出します。

var begin = moment(date).startOf('week').isoWeekday(1);

Working demo

9
letiagoalves

これにより、週の最初の曜日を設定できます。

moment.locale('en', {
    week: {
        dow: 6
    }
});
moment.locale('en');

Moment.isoWeekday(1)の代わりにmoment().weekday(1);を使用してください。

4
Roberto Aguilar

将来の覗き見のためにこれを追加すると思いました。必要に応じて月曜日を使用して、日曜日を常に確保することもできます。私にとっては、常に月曜日が必要ですが、ローカルは使用しているマシンに依存しており、これは簡単な修正です:

var begin = moment().isoWeekday(1).startOf('week');
var begin2 = moment().startOf('week');
// could check to see if day 1 = Sunday  then add 1 day
// my mac on bst still treats day 1 as sunday    

var firstDay = moment().startOf('week').format('dddd') === 'Sunday' ?     
moment().startOf('week').add('d',1).format('dddd DD-MM-YYYY') : 
moment().startOf('week').format('dddd DD-MM-YYYY');

document.body.innerHTML = '<b>could be monday or sunday depending on client: </b><br />' + 
begin.format('dddd DD-MM-YYYY') + 
'<br /><br /> <b>should be monday:</b> <br>' + firstDay + 
'<br><br> <b>could also be sunday or monday </b><br> ' + 
begin2.format('dddd DD-MM-YYYY');
2
davethecoder

これは、特定の平日のより一般的なソリューションです。 jsfiddleでのデモの作業

var myIsoWeekDay = 2; // say our weeks start on tuesday, for monday you would type 1, etc.

var startOfPeriod = moment("2013-06-23T00:00:00"),

// how many days do we have to substract?
var daysToSubtract = moment(startOfPeriod).isoWeekday() >= myIsoWeekDay ?
    moment(startOfPeriod).isoWeekday() - myIsoWeekDay :
    7 + moment(startOfPeriod).isoWeekday() - myIsoWeekDay;

// subtract days from start of period
var begin = moment(startOfPeriod).subtract('d', daysToSubtract);
1
Hinrich

isoWeekをデフォルトにする場合は、モーメントの動作を次のように変更できます。

const moment = require('moment');
const proto = Object.getPrototypeOf(moment());

const {startOf, endOf} = proto;
proto.startOf = function(period) {
  if (period === 'week') {
    period = 'isoWeek';
  }
  return startOf.call(this, period);
};
proto.endOf = function(period) {
  if (period === 'week') {
    period = 'isoWeek';
  }
  return endOf.call(this, period);
};

これで、日曜日になることを心配することなく、またはisoweekを使用するか、isoWeekを使用するかについて考える必要なく、単にsomeDate.startOf('week')を使用できます。

さらに、これをconst period = 'week'などの変数に保存し、subtract()またはadd()操作で安全に使用できます。 moment().subtract(1, period).startOf(period);。期間がisoWeekの場合、これは機能しません。

0
Adam Reis