Начало недели в понедельник с isoWeekday ()

117

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

savinger
источник

Ответы:

247

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

тетри
источник
10
startOf('week')зависит от текущего местоположения, где воскресенье, очевидно, знаменует начало недели в вашем случае. startOf('iweek')получит начало недели по ISO, то есть понедельник. Но ты прав, я не нашел никакой документации на официальном сайте ...
devnull69
15
Текущая версия moment.js использует isoweek.
Спасатель
2
Отредактировано в соответствии с комментарием @ saveer и текущими документами :)
Matchu
20
isoWeek, с большой буквы, в последней версии
Michiel
8
Документировано здесь: Начало времени
Владимир Корня
13

Звоните startOfраньше isoWeekday.

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

Рабочая демонстрация

letiagoalves
источник
1
Это не работает должным образом. Для сегодняшней даты, 2016-09-05, он возвращает 2016-08-29 как дату начала недели, что неверно, потому что сегодня понедельник (неделя iso). правильный ответ уже принят.
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');
davethecoder
источник
1
возможный сокращенный момент (). 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);
Hinrich
источник
-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.

Адам Рейс
источник