从周一的 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()一样,但是使用1-7的范围而不是0-6。

182133 次浏览

你只需要用 begin.startOf('week');代替 begin.startOf('isoWeek');

isoWeekday之前调用 startOf

var begin = moment(date).startOf('week').isoWeekday(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');

这里有一个更通用的解决方案,任何给定的工作日

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

这样你就可以设定一周的第一天。

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

确保它与 moment().weekday(1);一起使用,而不是 Moment.isoWeekday (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就不行了。