본문 바로가기
프로그래밍 언어/java + jsp + jstl

[Java/jsp] 자바로 구현한 삼성 주차(오늘이 올해의 몇주차인지) 관리하는 Util

by 우림 2015. 4. 14.

삼성에서 관리하는 일정의 주차는 조금 다릅니다.

1. 한 주는 월요일~일요일까지이다.
2. 한 주의 기준은 목요일이다.
3. 즉, 목요일을 기준으로 주차를 구하면 된다.
4. 2015년의 첫 목요일은 1월 1일이므로 첫주는 2014년 12월 29일(월) ~ 2015년 1월 4일(일)까지이다.


위 내용으로 삼성에서의 주차를 구하는 Java Util을 만들어 봤습니다.
혹시, 업무에 필요하시다면 참고하세요~


package oboe.pjt.util;
import java.util.Calendar;

public class DateUtilAdd extends oboe.foundation.util.DateUtil
{
	/**
	 * 두 날짜의 주차수 차이를 반환한다.
 	 * 
 	 * @return int
	 * @throws Exception
	 * @since 1.0
	 */
	public static int getWeekNumOfTwoDate( Calendar cal1, Calendar cal2 ) throws Exception
	{
		Calendar calThur1 = getCalThursdayThisWeek( cal1 );
		Calendar calThur2 = getCalThursdayThisWeek( cal2 );
		
		Calendar startCal = Calendar.getInstance();
		Calendar endCal = Calendar.getInstance();
		
		if( calThur1.before( calThur2 ) ) {
			startCal.set( calThur1.get( Calendar.YEAR ), calThur1.get( Calendar.MONTH ), calThur1.get( Calendar.DATE ) );
			endCal.set( calThur2.get( Calendar.YEAR ), calThur2.get( Calendar.MONTH ), calThur2.get( Calendar.DATE ) );
		} else {
			startCal.set( calThur2.get( Calendar.YEAR ), calThur2.get( Calendar.MONTH ), calThur2.get( Calendar.DATE ) );
			endCal.set( calThur1.get( Calendar.YEAR ), calThur1.get( Calendar.MONTH ), calThur1.get( Calendar.DATE ) );
		}

		int periodWeek = 0;
		while( endCal.after( startCal ) ) {
			startCal.add( Calendar.DATE, 7);
			periodWeek++;
		}
	
		return periodWeek;
	}
	
	/**
	 * 해당월의 주차수를 반환한다.
 	 * 
 	 * @return int
	 * @throws Exception
	 * @since 1.0
	 */
	public static int getWeekNumOfMonthTsst( Calendar cal ) throws Exception
	{
		Calendar thisMonthCal = Calendar.getInstance();
		thisMonthCal.set( cal.get( Calendar.YEAR ), cal.get( Calendar.MONTH ), 1 );
		
		Calendar nextMonthCal = Calendar.getInstance();
		nextMonthCal.set( cal.get( Calendar.YEAR ), cal.get( Calendar.MONTH ) + 1, 1 );
		
		Calendar thisMonthFirstThursday = getCalFirstWeekThursdayOfMonthTsst( thisMonthCal );
		Calendar nextMonthFirstThursday = getCalFirstWeekThursdayOfMonthTsst( nextMonthCal );

		int periodWeek = 0;
		while( nextMonthFirstThursday.after( thisMonthFirstThursday ) ) {
			thisMonthFirstThursday.add( Calendar.DATE, 7);
			periodWeek++;
		}
	
		return periodWeek;
	}
	
	/**
	 * 해당월의 몇번째 주인지를 반환한다.
 	 * 
 	 * @return int
	 * @throws Exception
	 * @since 1.0
	 */
	public static int getCountWeekOfMonthTsst( Calendar cal ) throws Exception
	{
		Calendar thisThursdayCal = getCalThursdayThisWeek( cal );
		Calendar firstThursdayYearCal = getCalFirstWeekThursdayOfMonthTsst( cal );

		int periodWeek = 0;
		while( !thisThursdayCal.before( firstThursdayYearCal ) ) {
			firstThursdayYearCal.add( Calendar.DATE, 7);
			periodWeek++;
		}
		
		return periodWeek;
	}
	
	/**
	 * 해당년도의 몇번째 주인지를 반환한다.
 	 * 
 	 * @return int
	 * @throws Exception
	 * @since 1.0
	 */
	public static int getCountWeekOfYearTsst( Calendar cal ) throws Exception
	{
		Calendar thisThursdayCal = getCalThursdayThisWeek( cal );
		Calendar firstThursdayYearCal = getCalFirstWeekThursdayOfYearTsst( thisThursdayCal );

		int periodWeek = 0;
		while( !thisThursdayCal.before( firstThursdayYearCal ) ) {
			firstThursdayYearCal.add( Calendar.DATE, 7);
			periodWeek++;
		}
		
		return periodWeek;
	}
	
	/**
	 * 해당월의 첫주 시작 목요일을 구한다.
 	 * 
 	 * @return int
	 * @throws Exception
	 * @since 1.0
	 */
	public static Calendar getCalFirstWeekThursdayOfMonthTsst( Calendar cal ) throws Exception
	{
		// 해당년의 시작일(1월 1일)을 셋팅하기
		Calendar firstCal = Calendar.getInstance();
		firstCal.set( cal.get( Calendar.YEAR ), cal.get( Calendar.MONTH ), 1 );
		
		// 기준이 되는 목요일을 구하자.
		firstCal = getCalThursdayThisWeek( firstCal );
		
		// 기준이 되는 목요일이 전월이라면 7일을 더하자.
		if( cal.get( Calendar.MONTH ) != firstCal.get( Calendar.MONTH ) ) {
			firstCal.add( Calendar.DATE, 7 );
		}

		return firstCal;
	}
	
	/**
	 * 해당월의 마지막주 종료 목요일을 구한다.
 	 * 
 	 * @return int
	 * @throws Exception
	 * @since 1.0
	 */
	public static Calendar getCalLastWeekThursdayOfMonthTsst( Calendar cal ) throws Exception
	{
		// 해당월의 마지막날짜를 셋팅하자
		Calendar lastCal = Calendar.getInstance();
		lastCal.set( cal.get( Calendar.YEAR ), cal.get( Calendar.MONTH ) + 1, 1 );
		lastCal.add( lastCal.get( Calendar.DATE), -1 );
		
		// 기준이 되는 목요일을 구하자.
		lastCal = getCalThursdayThisWeek( lastCal );
		
		// 기준이 되는 목요일이 내년이라면 7일을 빼자.
		if( cal.get( Calendar.MONTH ) != lastCal.get( Calendar.MONTH ) ) {
			cal.add( Calendar.DATE, -7 );
		}
		
		return cal;
	}
	
	/**
	 * 해당년도의 첫주 시작 목요일을 구한다.
 	 * 
 	 * @return int
	 * @throws Exception
	 * @since 1.0
	 */
	public static Calendar getCalFirstWeekThursdayOfYearTsst( Calendar cal ) throws Exception
	{
		// 해당년의 시작일(1월 1일)을 셋팅하기
		Calendar firstCal = Calendar.getInstance();
		firstCal.set( cal.get( Calendar.YEAR ), 0, 1 );
		
		// 기준이 되는 목요일을 구하자.
		firstCal = getCalThursdayThisWeek( firstCal );
		
		// 기준이 되는 목요일이 전년도라면 7일을 더하자.
		if( cal.get( Calendar.YEAR ) != firstCal.get( Calendar.YEAR ) ) {
			firstCal.add( Calendar.DATE, 7 );
		}
		
		return firstCal;
	}
	
	/**
	 * 해당년도의 마지막주 종료 목요일을 구한다.
 	 * 
 	 * @return int
	 * @throws Exception
	 * @since 1.0
	 */
	public static Calendar getCalLastWeekThursdayOfYearTsst( Calendar cal ) throws Exception
	{
		// 해당년도의 마지막날짜(12월 31일)을 셋팅하자.
		int year = cal.get( Calendar.YEAR );
		cal.set( year, 11, 31 );
		
		// 기준이 되는 목요일을 구하자.
		Calendar lastCal = Calendar.getInstance();
		lastCal = getCalThursdayThisWeek( cal );
		
		// 기준이 되는 목요일이 내년이라면 7일을 빼자.
		if( lastCal.get( Calendar.YEAR ) != year ) {
			lastCal.add( Calendar.DATE, -7 );
		}
		
		return lastCal;
	}
	
	/** 
	 * 한주의 기준이 되는 목요일을 구하자.
	 * - 목요일을 기준으로 앞뒤 3일이 한주가 된다.
 	 * 
 	 * @return int
	 * @throws Exception
	 * @since 1.0
	 */
	public static Calendar getCalThursdayThisWeek( Calendar cal ) throws Exception
	{		
		int dayOfWeek = cal.get( Calendar.DAY_OF_WEEK );
			
		Calendar thursdayCal = Calendar.getInstance();
		thursdayCal.set( cal.get( Calendar.YEAR ), cal.get( Calendar.MONTH ), cal.get( Calendar.DATE ) );

		// 일요일은 3일을 빼서 목요일을 구하고
		if( dayOfWeek == 1 ) {
			thursdayCal.add( Calendar.DATE, -3 );
		}
		// 일요일이 아니면 목요일의 숫자 5에서 해당요일의 값을 빼준값을 더한다.
		else {
			thursdayCal.add( Calendar.DATE, 5 - dayOfWeek );
		}
		
		return thursdayCal;
	}
}

댓글