Developer Cafe

사례를 통해 JAVA코드로 달력 구현하기 본문

JAVA

사례를 통해 JAVA코드로 달력 구현하기

개발자 카페 2021. 6. 23. 16:06
728x90
맨 아래에 쓰여진 매소드 정리해놨습니다.

2021/07/01 로 기본 세팅

    int month = 7;
    int year = 2021;
    
    Calendar cal = Calendar.getInstance();
    cal.set(year,month-1,1);

사례1. 연월일이 정확히 몇주차인지 알고싶다.

System.out.println(getCurrentWeekOfMonth(2021,6,20));

6월의 3주차라는 의미다.

사례2. 해당날짜의 마지막 날짜가 몇일인지 알고싶다.

System.out.println(cal.getActualMaximum(Calendar.DAY_OF_MONTH));

2021년 7월은 31일이 마지막 날짜다 라는 의미다.

사례3. 해당날짜의 마지막 주차가 몇주차인지 알고싶다.

System.out.println(getCurrentWeekOfMonth(year,month,cal.getActualMaximum(Calendar.DAY_OF_MONTH)));

7월은 5주차까지 있다라는 의미이다.

사례4-1. 각 주차별 첫째 날짜와 마지막 날짜를 알고싶다.

List<String> result = getWeekInMonths(year,month);
System.out.println(result);

0행은 1주차의 첫날 1행은 1주차의 마지막날 이라는 의미이다. 2행은 2주차의 첫날 3행은 2주차의 마지막날 이라는 의미이다.

사례4-2. 사례4-1에서 구한 결과값을 yyyy-MM-dd 형태로 변환하고 싶다.

        List<String> result = getWeekInMonths(year,month);    // 일단 1픽
        System.out.println(result);

        try {
          SimpleDateFormat dtFormat = new SimpleDateFormat("yyyyMMdd");
          SimpleDateFormat newDtFormat = new SimpleDateFormat("yyyy-MM-dd");
          for (int i = 0 ; i<result.size() ; i++) {
            // String 타입을 Date 타입으로 변환
            Date formatDate = dtFormat.parse(result.get(i));
            // Date타입의 변수를 새롭게 지정한 포맷으로 변환
            String strNewDtFormat = newDtFormat.format(formatDate);
            System.out.println(strNewDtFormat);
          }
        }catch (ParseException e) {
          e.printStackTrace();
        }


여기서부터는 예제에 쓰인 매소드들 입니다.

getCurrentWeekOfMonth

public static String getCurrentWeekOfMonth(int year, int month, int day)  {
    int subtractFirstWeekNumber = subWeekNumberIsFirstDayAfterThursday(year, month, day);
    int subtractLastWeekNumber = addMonthIsLastDayBeforeThursday(year, month, day);

    // 마지막 주차에서 다음 달로 넘어갈 경우 다음달의 1일을 기준으로 정해준다.
    // 추가로 다음 달 첫째주는 목요일부터 시작하는 과반수의 일자를 포함하기 때문에 한주를 빼지 않는다.
    if (subtractLastWeekNumber > 0) {
      day = 1;
      subtractFirstWeekNumber = 0;
    }

    if (subtractFirstWeekNumber < 0)  {
      Calendar calendar = Calendar.getInstance(Locale.KOREA);
      calendar.set(year, month - 1, day);
      calendar.add(Calendar.DATE, -1);



      return getCurrentWeekOfMonth(calendar.get(Calendar.YEAR), (calendar.get(Calendar.MONTH) + 1), calendar.get(Calendar.DATE));
    }

    Calendar calendar = Calendar.getInstance(Locale.KOREA);
    calendar.setFirstDayOfWeek(Calendar.MONDAY);
    calendar.setMinimalDaysInFirstWeek(1);
    calendar.set(year, month - (1 - subtractLastWeekNumber), day);

    int dayOfWeekForFirstDayOfMonth = calendar.get(Calendar.WEEK_OF_MONTH) - subtractFirstWeekNumber;

//    return (calendar.get(Calendar.MONTH) + 1) + "," + dayOfWeekForFirstDayOfMonth;
    return (calendar.get(Calendar.MONTH) + 1) + "," + dayOfWeekForFirstDayOfMonth;
  }

subWeekNumberIsFirstDayAfterThursday (getCurrentWeekOfMonth 가 호출함)

  public static int subWeekNumberIsFirstDayAfterThursday(int year, int month, int day)  {
    Calendar calendar = Calendar.getInstance(Locale.KOREA);
    calendar.set(year, month - 1, day);
    calendar.set(Calendar.DAY_OF_MONTH, 1);
    calendar.setFirstDayOfWeek(Calendar.MONDAY);

    int weekOfDay = calendar.get(Calendar.DAY_OF_WEEK);

    if ((weekOfDay >= Calendar.MONDAY) && (weekOfDay <= Calendar.THURSDAY)) {
      return 0;
    } else if (day == 1 && (weekOfDay < Calendar.MONDAY || weekOfDay > Calendar.TUESDAY))  {
      return -1;
    } else {
      return 1;
    }
  }

addMonthIsLastDayBeforeThursday (getCurrentWeekOfMonth 가 호출함)

  public static int addMonthIsLastDayBeforeThursday(int year, int month, int day) {
    Calendar calendar = Calendar.getInstance(Locale.KOREA);
    calendar.setFirstDayOfWeek(Calendar.MONDAY);
    calendar.set(year, month - 1, day);

    int currentWeekNumber = calendar.get(Calendar.WEEK_OF_MONTH);
    int maximumWeekNumber = calendar.getActualMaximum(Calendar.WEEK_OF_MONTH);

    if (currentWeekNumber == maximumWeekNumber) {
      calendar.set(year, month - 1, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
      int maximumDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);

      if (maximumDayOfWeek < Calendar.THURSDAY && maximumDayOfWeek > Calendar.SUNDAY) {
        return 1;
      } else {
        return 0;
      }
    } else {
      return 0;
    }
  }

getWeekInMonths

  public static List<String> getWeekInMonths(int year, int month) {

    List<String> result = new ArrayList<>();

    Calendar cal = Calendar.getInstance();

    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month - 1);

    for (int week = 1; week < cal.getMaximum(Calendar.WEEK_OF_MONTH); week++) {
      cal.set(Calendar.WEEK_OF_MONTH, week);

      cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
      int startDay = cal.get(Calendar.DAY_OF_MONTH);

      cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
      int endDay = cal.get(Calendar.DAY_OF_MONTH);

      if (week == 1 && startDay >= 7) {
        startDay = 1;
      }

      if (week == cal.getMaximum(Calendar.WEEK_OF_MONTH) - 1 && endDay <= 7) {
        cal.set(Calendar.MONTH, month - 1);
        endDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
      }

      String monthR = Integer.toString(month);
      String startDayR = Integer.toString(startDay);
      String endDayR = Integer.toString(endDay);

      if (month<10) monthR = "0"+monthR;
      if (startDay<10) startDayR = "0"+startDayR;
      if (endDay<10) endDayR = "0"+endDayR;

      result.add(year+monthR+startDayR);
      result.add(year+monthR+endDayR);

//      System.out.println(week + "주 : " + startDay + " ~ " + endDay);
    }
    return result;
  }

getWeekOfYear

  private static int getWeekOfYear(String date) {
    Calendar calendar = Calendar.getInstance();
    String[] dates = date.split("-");
    int year = Integer.parseInt(dates[0]);
    int month = Integer.parseInt(dates[1]);
    int day = Integer.parseInt(dates[2]);
    calendar.set(year, month - 1, day);

    return calendar.get(Calendar.WEEK_OF_MONTH);
  }
728x90
Comments