週を表形式で印刷するカレンダーを作成しています。 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);
}
EDITisoWeekday
が実際に行っていることを誤解しました。 「どの曜日が週の最初の日であるか」変数を設定すると思いました(それは存在しません)。実際に行われるのは、moment.weekday()
と同様に曜日を変更するだけですが、0-6ではなく1-7の範囲を使用します。
begin.startOf('isoWeek');
の代わりにbegin.startOf('week');
を使用してみてください
これにより、週の最初の曜日を設定できます。
moment.locale('en', {
week: {
dow: 6
}
});
moment.locale('en');
Moment.isoWeekday(1)の代わりにmoment().weekday(1);
を使用してください。
将来の覗き見のためにこれを追加すると思いました。必要に応じて月曜日を使用して、日曜日を常に確保することもできます。私にとっては、常に月曜日が必要ですが、ローカルは使用しているマシンに依存しており、これは簡単な修正です:
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');
これは、特定の平日のより一般的なソリューションです。 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);
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
の場合、これは機能しません。