Moment.js – 周一开始,周一是iso周一()

我正在创build一个日历,以表格的forms打印出来。 一个要求是,我可以在星期一或星期天开始几周,根据某些用户选项。 我正在使用iso时期的方法来度过难关 。

// 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实际上在做什么。 我认为它设置了“一周中的哪一天是一周中的第一天”variables(不存在)。 它实际上只是改变星期几,就像moment.weekday() ,但是使用1-7范围而不是0-6。

尝试使用begin.startOf('isoweek'); 而不是begin.startOf('week');

startOf之前调用isoWeekday

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

工作演示

以为我会join这个为未来的窥视。 它会一直确保它的星期一,如果需要,也可以用来始终保证星期天。 对我来说,我总是需要星期一,但本地是依赖于正在使用的机器,这是一个简单的解决方法:

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

对于任何给定的工作日,这是一个更通用的解决scheme。 在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);