月曜日の週をisoWeekday()で開始する


116

週を表形式で印刷するカレンダーを作成しています。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

編集isoWeekdayは実際に何をしていたのかを誤解しました。「どの曜日が週の最初の曜日か」という変数を設定すると思った(存在しない)。実際に行うことは、のように曜日を変更するだけですが、moment.weekday()0〜6ではなく1〜7の範囲を使用します。

回答:


246

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


10
startOf('week')現在のロケールに依存しますが、日曜日は明らかにあなたの場合の週の始まりを示します。startOf('iweek')月曜日である週のISO開始を取得します。しかし、あなたは正しいです、私は公式サイトでドキュメントを見つけませんでした...
devnull69

15
moment.jsの現在のバージョンはを使用していisoweekます。
savinger


20
isoWeek、最新のバージョンでは大文字のW付き
Michiel 14


13

startOf前にお電話くださいisoWeekday

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

作業デモ


1
これは正しく動作しません。今日の日付である2016-09-05は、今日が月曜日(等週)であるため、週の開始日として2016-08-29を返しますが、これは正しくありません。正しい答えはすでに受け入れられています。
undefinedman

9

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

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

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


2

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

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');

1
可能なショートカットmoment()。isoWeekday(1).startOf( 'isoweek')。format( 'dddd DD MM YYYY')
davethecoder

2

以下は、特定の平日のより一般的なソリューションです。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

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

今、あなたは簡単に使用することができsomeDate.startOf('week')ますが、日曜日を得るでしょう心配または使用するかどうかを考えることなく、isoweekまたはisoWeekなど

さらに、これをのような変数に保存して、やの演算などconst period = 'week'で安全に使用できます。これはピリオドが存在すると機能しません。subtract()add()moment().subtract(1, period).startOf(period);isoWeek

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.