(JS) Y년 M월 N주차를 구하는 함수

정은경·2021년 11월 19일
0

공통

  • iso의 한주의 시작요일은 요일(js에서 월요일은 1이고, 일요일은 7이다)
  • iso의 연주차를 계산하는 방법 (우리나라 방법이랑 동일)
    * 예) 1월 1일이 금요일부터 시작하면, 해당주는 이전해의 마지막달의 주
    • 예) 1월 1일이 금요일이전(금요일 미포함, 목요일까지만)에 시작하면, 해당주는 1월의 첫번째주가 된다

월요일날짜를 입력하면 해당 월요일의 Y년M월N주차를 리턴

function getWeekIndexOfMonthFromMondayDate(targetMondayDate) {
    // N년 N월 N주차 리턴하는 함수
    let startDate = null
    if (targetMondayDate.getMonth() == 0){
      	// 주의: new Date(2021,0,1)은 2021-01-01이다. new Date에서 월은 0부터시작
      	// new Date(2021,0,1).getMonth()는 숫자 1
      	// 아이러니함
        startDate = new Date(targetMondayDate.getFullYear()-1, 12-1, 1);
    }
    else{
        startDate = new Date(targetMondayDate.getFullYear(), targetMondayDate.getMonth()-1, 1);
    }
    let currentDate = new Date(startDate)
    let currentYear = startDate.getFullYear();
    let currentMonth = startDate.getMonth() + 1;
    let currentWeekIndex = 0;
    let mondayDate = null;
    
    // 달의 첫번째 주 포함여부 체크
    if (currentDate.getDay() < 5) {
        // 해당 월의 첫주가 해당 달의 첫주가 되는 경우 (첫주의 시작일이 금요일(5) 이전이면 해당 달의 첫주가 됨)
        currentWeekIndex += 1;
        currentDate.setDate(currentDate.getDate() - currentDate.getDay() + 1);
    }
    else {
        // 해당 월의 첫주가 해당 달이 아닌 전 달의 첫주가 되는 경우
        // 8 -x : 다음번 월요일의 날짜를 구하는 공식
        currentDate.setDate(currentDate.getDate() + 8 - currentDate.getDay());
    }
    while (currentDate <= targetMondayDate) {
        currentWeekIndex += 1;
        if (currentMonth != (currentDate.getMonth() +1)){
            currentWeekIndex =1
        }
        currentMonth = currentDate.getMonth()+1;
        currentYear = currentDate.getFullYear();
        mondayDate = new Date(currentDate);

        let tempDate = new Date(currentDate);
        // 달이 바뀌는지 체크 (해당주의 목요일이 다른 달이면 해당 주는 다른 달의 주)
        tempDate.setDate(tempDate.getDate() + 3);
        if (tempDate.getMonth() != currentDate.getMonth()){
            currentWeekIndex =1
            currentYear = tempDate.getFullYear();
            currentMonth = tempDate.getMonth()+1;
        }

        currentDate.setDate(currentDate.getDate() + 7);
    }

    return {
        id: currentYear * 10000 + currentMonth * 100 + currentWeekIndex,
        year: currentYear,
        month: currentMonth,
        weekIndex: currentWeekIndex,
        mondayDate: mondayDate
    };
}

연중주차번호를 입력하면 해당 주의 월요일 날짜를 리턴

function getMondayDateFromWeekNumberOfYear(year, weekNumber) {
    // 2021/01/01 금요일
    // 2021/01/04 월요일
    // 파이썬 isocalendar 결과
    // >>> datetime.datetime(2021,1,1,0,0).isocalendar()
    // (2020, 53, 5)
    // >>> datetime.datetime(2021,1,4,0,0).isocalendar()
    // (2021, 1, 1)
    // >>>
    let date = new Date(year, 0, 1); // year-01-01
    let mondayDate = new Date(date);

    if (date.getDay() == 1) {
        // 1월 1일이 월요일인 경우
    }
    else if (date.getDay() < 5) {
        let days_to_del_for_prev_monday = date.getDay() + 1;
        mondayDate.setDate(mondayDate.getDate() - days_to_del_for_prev_monday);
    }
    else {
        // 해당 해의 1일이 목요일 이후 경우는 해당 주는 전 년도의 마지막 달의 마지막 주가 된다
        // 다음 월요일을 구하기 위해 더해야하는 날 수 구하는 공식
        let days_to_add_for_next_monday = 7 - date.getDay() + 1;
        mondayDate.setDate(mondayDate.getDate() + days_to_add_for_next_monday);
    }
    mondayDate.setDate(mondayDate.getDate() + (weekNumber-1) * 7);
    return mondayDate;
}
profile
#의식의흐름 #순간순간 #생각의스냅샷

0개의 댓글