Починаємо тиждень у понеділок з 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

EDIT Я неправильно зрозумів, що isoWeekdayнасправді робить. Я думав, що вона встановлює змінну "який день тижня - перший день тижня" (що не існує). Насправді це просто змінює день тижня, як і колись moment.weekday(), але використовує діапазон 1-7 замість 0-6.

Відповіді:


247

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


10
startOf('week')залежить від поточного місцевого розташування, у якому неділя очевидно позначає початок тижня у вашому випадку. startOf('iweek')отримає початок тижня ISO, що є понеділком. Але ти маєш рацію, я не знайшов жодної документації на офіційному сайті ...
devnull69

15
Використовується поточна версія moment.js isoweek.
економ

2
Відредаговано згідно з коментарем @ savinger та поточними документами :)
Matchu

20
isoWeek, з великою літери W, в останній версії
Michiel

8
Задокументовано тут: початок часу
Володимир Корнеа

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
можливий короткий момент (). isoWeekday (1) .startOf ('isoweek'). формат ('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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.