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()0-6 대신 1-7 범위를 사용합니다.

답변:


247

begin.startOf('isoWeek');대신 사용해보십시오begin.startOf('week');


10
startOf('week')일요일이 분명히 귀하의 경우 주 시작을 나타내는 현재 로케일에 따라 다릅니다. startOf('iweek')월요일에 ISO가 시작됩니다. 하지만 당신이 맞아요, 나는 ... 공식 사이트에있는 모든 문서를 찾을 수 없습니다
devnull69

15
moment.js의 현재 버전은 isoweek.
saveer

2
@savinger의 댓글과 현재 문서 에 따라 수정 됨 :)
Matchu

20
isoWeek, 대문자 W, 최신 버전
Michiel 2014

8
여기에 문서화 됨 : 시작 시간
Vladimir Kornea 2014-06-11

13

startOf전에 전화하십시오 isoWeekday.

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

작업 데모


1
이것은 제대로 작동하지 않습니다. 오늘 날짜 인 2016-09-05의 경우 오늘이 월요일 (iso 주)이기 때문에 참이 아닌주의 시작 날짜로 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
가능한 단축키 moment (). 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);

-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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.