Подтвердить что ты не робот

Moment.js - начало недели в понедельник с помощью isoWeekday()

Я создаю календарь, где я печатаю недели в табличном формате. Одно из требований заключается в том, что я могу начать недели либо в понедельник, либо в воскресенье, согласно некоторым пользовательским параметрам. Мне сложно использовать способ 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 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.

4b9b3361

Ответ 1

попробуйте использовать begin.startOf('isoWeek'); вместо begin.startOf('week');

Ответ 3

Думаю, я бы добавил это для любых будущих взглядов. Он всегда будет следить за тем, чтобы его понедельник, если необходимо, также можно было использовать, чтобы всегда обеспечить воскресение. Для меня мне всегда нужно понедельника, но локально зависит от используемой машины, и это легко исправить:

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

Ответ 4

Вот более общее решение для любого дня недели. Рабочая демонстрация на 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);