본문 바로가기
ETC

[JavaScript] 날짜 주차 / 기간 구하기

by KIMECK 2024. 7. 1.
728x90
반응형

 

 

자바스크립트

주차별 기간 구하기 

 

// 해당하는 주차(이번주차) 기간 화면에 셋팅하기
function funcNowWeek() {
    var nowYmd = '20240103'
    var selectedWeekPeriod = funcPeriodWeek(nowYmd);
    // ex) 2024-01-01 ~ 2024-01-07 
    var titleText = " 주차 : " + selectedWeekPeriod;
    self.$subTitle.text(titleText);
}

// 기간 구하기 (sampleWeek)
function funcPeriodWeek(selectedYmd) {
    // 선택된 날짜의 기준 목요일 가져오기
    var selectedThursdayYmd = sampleWeek.getDateThursdayThisWeek(selectedYmd);
    var selectedThursdayObj = sampleWeek.getDateObjByYmd(selectedThursdayYmd);

    // 선택된 날짜의 월요일 가져오기
    var selectedMondayYmd = sampleWeek.getYmdByDateObj(sampleWeek.getDateObjAddDate(selectedThursdayObj, -3));

    // 선택된 날짜의 일요일 가져오기
    var selectedSundayYmd = sampleWeek.getYmdByDateObj(sampleWeek.getDateObjAddDate(selectedThursdayObj, 3));

    var result = selectedMondayYmd.substring(0, 4) + "-"
        + selectedMondayYmd.substring(4, 6) + "-"
        + selectedMondayYmd.substring(6, 8)
        + " ~ "
        + selectedSundayYmd.substring(0, 4) + "-"
        + selectedSundayYmd.substring(4, 6) + "-"
        + selectedSundayYmd.substring(6, 8);

    weekStart = selectedMondayYmd;
    weekEnd = selectedSundayYmd;

    return result;
}



var sampleWeek = {

    /**
     * 두 날짜의 주차수 차이를 반환한다.
     * 
     */
    getWeekNumOfTwoDate: function (ymd1, ymd2) {
        // 두 날짜의 기준 목요일을 구한다.
        var thursdayYmd1 = this.getDateThursdayThisWeek(ymd1);
        var thursdayYmd2 = this.getDateThursdayThisWeek(ymd2);

        // 날짜의 크기별로 변수에 넣는다.
        var beforeYmd = thursdayYmd1;
        var afterYmd = thursdayYmd2;

        if (thursdayYmd1 > thursdayYmd2) {
            beforeYmd = thursdayYmd2;
            afterYmd = thursdayYmd1;
        }

        var periodWeek = 0;
        while (beforeYmd <= afterYmd) {
            var beforeObj = this.getDateObjByYmd(beforeYmd);
            var d = this.getDateObjAddDate(beforeObj, 7);
            beforeYmd = this.getYmdByDateObj(d);
            periodWeek++;
        }

        return periodWeek;
    },

    /**
     * 해당월의 주차수를 반환한다.
     * 
     */
    getWeekNumOfMonthTsst: function (ymd) {
        // 이번달 1일을 셋팅한다.
        var thisMonthD = new Date(this.getModeValueByYmd(ymd, "year"), getModeValueByYmd(ymd, "month") - 1, 1);

        // 다음달 1일을 셋팅한다.
        var nextMonthD = new Date(this.getModeValueByYmd(ymd, "year"), getModeValueByYmd(ymd, "month"), 1);

        // 이번달 1일에 해당하는 기준 목요일을 구한다.
        var thisThursdayYmd = this.getDateThursdayThisWeek(getYmdByDateObj(thisMonthD));

        // 다음달 1일에 해당하는 기준 목요일을 구한다.
        var nextThursdayYyyyMmDd = this.getDateThursdayThisWeek(getYmdByDateObj(nextMonthD));

        var periodWeek = 0;
        while (thisThursdayYmd <= nextThursdayYyyyMmDd) {
            var thisThursdayObj = this.getDateObjByYmd(thisThursdayYmd);
            var d = this.getDateObjAddDate(thisThursdayObj, 7);
            thisThursdayYmd = this.getYmdByDateObj(d);
            periodWeek++;
        }

        return periodWeek;
    },

    /**
     * 해당월의 몇번째 주인지를 반환한다.
     * 
     */
    getCountWeekOfMonthTsst: function (ymd) {
        // 해당일의 기준이 되는 목요일을 구하자.
        var thisThursdayYmd = this.getDateThursdayThisWeek(ymd);

        // 해당월의 첫번째 목요일을 구하자.
        var firstThursdayYmd = this.getDateFirstWeekThursdayOfMonthTsst(ymd);

        var periodWeek = 0;
        while (firstThursdayYmd < thisThursdayYmd) {
            var firstThursdayObj = this.getDateObjByYmd(firstThursdayYmd);
            var d = this.getDateObjAddDate(firstThursdayObj, 7);
            firstThursdayYmd = this.getYmdByDateObj(d);
            periodWeek++;
        }

        return periodWeek + 1;
    },

    /**
     * 해당월의 첫주 시작 목요일을 구한다.
     * 
     */
    getDateFirstWeekThursdayOfMonthTsst: function (ymd) {
        // 해당월의 시작일(1월 1일)을 셋팅하기
        var firstDateYmd = ymd.substring(0, 6) + "01";
        var mm = this.getModeValueByYmd(ymd, "month");

        // 기준이 되는 목요일을 구하자.
        var firstThursdayYmd = this.getDateThursdayThisWeek(firstDateYmd);
        var firstThursdayMm = this.getModeValueByYmd(firstThursdayYmd, "month");

        // 기준이 되는 목요일이 작년이라면 7일을 더하자.
        if (firstThursdayMm != mm) {
            var firstThursdayObj = this.getDateObjByYmd(firstThursdayYmd);
            var d = this.getDateObjAddDate(firstThursdayObj, 7);
            firstThursdayYmd = this.getYmdByDateObj(d);
        }

        return firstThursdayYmd;
    },

    /**
     * 해당월의 마지막주 종료 목요일을 구한다.
     * 
     */
    getDateLastWeekThursdayOfMonthTsst: function (ymd) {
        // 해당월의 마지막날짜를 셋팅하자
        var lastD = new Date(this.getModeValueByYmd(ymd, "year"), this.getModeValueByYmd(ymd, "month"), 0);

        var mm = this.getModeValueByYmd(ymd, "month");
        var lastDateYmd = this.getYmdByDateObj(lastD);

        // 기준이 되는 목요일을 구하자.
        var lastThursdayYmd = this.getDateThursdayThisWeek(lastDateYmd);
        var lastThursdayMm = this.getModeValueByYmd(lastThursdayYmd, "month");

        // 기준이 되는 목요일이 다음월이라면 7일을 빼자.
        if (lastThursdayMm != mm) {
            var lastThursdayObj = this.getDateObjByYmd(lastThursdayYmd);
            var d = this.getDateObjAddDate(lastThursdayObj, -7);
            lastThursdayYmd = this.getYmdByDateObj(d);
        }

        return lastThursdayYmd;
    },

    /**
     * 해당년도의 첫주 시작 목요일을 구한다.
     * 
     */
    getDateFirstWeekThursdayOfYearTsst: function (yyyy) {
        // 해당년의 시작일(1월 1일)을 셋팅하기
        var firstDateYmd = yyyy + "0101";

        // 기준이 되는 목요일을 구하자.
        var firstThursdayYmd = this.getDateThursdayThisWeek(firstDateYmd);
        var firstThursdayYyyy = this.getModeValueByYmd(firstThursdayYmd, "year");

        // 기준이 되는 목요일이 작년이라면 7일을 더하자.
        if (firstThursdayYyyy != yyyy) {
            var firstThursdayObj = this.getDateObjByYmd(firstThursdayYmd);
            var d = this.getDateObjAddDate(firstThursdayObj, 7);
            firstThursdayYmd = this.getYmdByDateObj(d);
        }

        return firstThursdayYmd;
    },

    /**
     * 해당년도의 마지막주 종료 목요일을 구한다.
     * 
     */
    getDateLastWeekThursdayOfYearTsst: function (yyyy) {
        // 해당년도의 마지막날짜(12월 31일)을 셋팅하자
        var lastDateYmd = yyyy + "1231";

        // 기준이 되는 목요일을 구하자.
        var lastThursdayYmd = this.getDateThursdayThisWeek(lastDateYmd);
        var lastThursdayYyyy = this.getModeValueByYmd(lastThursdayYmd, "year");

        // 기준이 되는 목요일이 내년이라면 7일을 빼자.
        if (lastThursdayYyyy != yyyy) {
            var lastThursdayObj = this.getDateObjByYmd(lastThursdayYmd);
            var d = this.getDateObjAddDate(lastThursdayObj, -7);
            lastThursdayYmd = this.getYmdByDateObj(d);
        }

        return lastThursdayYmd;
    },

    /** 
     * 해당일의 년도를 가져오자.
     */
    getYearByYmd: function (ymd) {
        var thursdayYmd = this.getDateThursdayThisWeek(ymd);
        return thursdayYmd.substring(0, 4);
    },

    /** 
     * 한주의 기준이 되는 목요일을 구하자.
     * - 목요일을 기준으로 앞뒤 3일이 한주가 된다.
     */
    getDateThursdayThisWeek: function (ymd) {
        var yyyy = this.getModeValueByYmd(ymd, "year");
        var mm = this.getModeValueByYmd(ymd, "month") - 1;
        var dd = this.getModeValueByYmd(ymd, "date");

        var d = new Date(yyyy, mm, dd);

        var dayOfWeek = d.getDay();		// 일요일~토요일(0~6)
        var addDate = 0;

        // 일요일은 3일을 빼서 목요일을 구한다.
        if (dayOfWeek == 0) addDate = -3;
        else addDate = 4 - dayOfWeek;

        // 구한날짜만큼 더한다.
        var thursdayD = this.getDateObjAddDate(d, addDate);

        return this.getYmdByDateObj(thursdayD);
    },

    /** 
     * yyyyMmDd 입력받아서 년/월/일 반환하기
     * 
     */
    getModeValueByYmd: function (ymd, mode) {
        var result = ymd;

        if (ymd && ymd.length == 8) {
            if (mode == "year") result = ymd.substring(0, 4);
            if (mode == "month") result = ymd.substring(4, 6);
            if (mode == "date") result = ymd.substring(6, 8);

            if (result) result = parseInt(result);
        }

        return result;
    },

    /** 
     * 날짜객체 입력받아서 yyyyMMdd 반환하기
     * 
     */
    getYmdByDateObj: function (dateObj) {

        var yyyy = dateObj.getFullYear();
        var mm = dateObj.getMonth() + 1;
        var dd = dateObj.getDate();

        if (mm < 10) mm = "0" + mm;
        if (dd < 10) dd = "0" + dd;

        var result = yyyy + "" + mm + "" + dd;

        return result;
    },

    /** 
     * yyyyMMdd 입력받아서 날짜객체 반환하기
     * 
     */
    getDateObjByYmd: function (ymd) {

        var yyyy = this.getModeValueByYmd(ymd, "year");
        var mm = this.getModeValueByYmd(ymd, "month") - 1;
        var dd = this.getModeValueByYmd(ymd, "date");

        var resultD = new Date(yyyy, mm, dd);
        return resultD;
    },

    /** 
     * 날짜객체 입력 받아서 해당날짜만큼 더해서 날짜객체 반환하기
     * 
     */
    getDateObjAddDate: function (dateObj, addDate) {

        var resultD = new Date(dateObj.getFullYear(), dateObj.getMonth(), dateObj.getDate() + addDate);

        return resultD;
    }

}

 

728x90
반응형

댓글