IT_Programming/Java

Calendar클래스(GregorianCalendar)를 이용한 달력 출력하기

JJun ™ 2007. 2. 6. 10:19

import! java.util.*;

class CalendarTest
{
      public static void main(String[] args)
      {
            if(args.length !=2)

            {
                  System.out.println("Usage : java CalendarTest 2004 11");
                  return;
            }
            int year = Integer.parseInt(args[0]);
            int month = Integer.parseInt(args[1]);

            int START_DAY_OF_WEEK = 0;
            int END_DAY = 0;

            Calendar sDay = Calendar.getInstance();       // 시작일
            Calendar eDay = Calendar.getInstance();       // 끝일 

     // 월의 경우 0부터 11까지의 값을 가지므로 1을 빼줘야한다. 
     // 예를 들어, 2004년 11월 1일은 sDay.set(2004, 10, 1);과 같이 해줘야한다.
            sDay.set(year, month-1, 1);      
            eDay.set(year, month, 1);

            // 다음달의 첫날에서 하루를 빼면 현재달의 마지막날이된다.
            // 12월 1일에서 하루를 빼면 11월 30일이 된다.
            // 2월의 경우 28일인지 29일인지 모르기 때문에 이렇게 한다.
            eDay.add(Calendar.DAY_OF_MONTH, -1);      

            // 첫번째 요일이 무슨요일인지 알아낸다.
            START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
            // eDay에 지정된 날짜를 얻어온다.
            END_DAY = eDay.get(Calendar.DAY_OF_MONTH);
           
            System.out.println(" " + args[0] +"년 " + args[1] +"월");
            System.out.println(" SU MO TU WE TH FR SA");

            // 해당월의 1일이 어느 요일인지에 따라서 공백을 출력한다.
            // 만일 1일이 수요일이라면 공백을 세번 찍는다.(일요일부터 시작)
            for(int i=1; i < START_DAY_OF_WEEK; i++) {
                  System.out.print("   ");
            }

            for(int i=1, n=START_DAY_OF_WEEK ; i <= END_DAY; i++, n++) {
                  System.out.print((i < 10)? "  "+i : " "+i );
                  if(n%7==0) System.out.println();
            }
      }
}
/*

C:\j2sdk1.4\work>java CalendarTest 2004 3

      2004년 3월

SU MO TU WE TH FR SA

     1  2  3  4  5  6

  7  8  9 10 11 12 13

14 15 16 17 18 19 20

21 22 23 24 25 26 27

28 29 30 31

C:\j2sdk1.4\work>

*/

====================================================================

 

// 날짜관련함수 - 날짜간의 차이, 요일구하기, 윤년체크 //

 

import! java.util.*;

class DateTest
{
      public static void main(String[] args)
      { 
            int year=2004; 
            int month = 4;
            int day = 31;

            System.out.println("2004. 5. 31 :" + getDayOfWeek(2004, 5, 31));
            System.out.println("2002. 6. 1 :" + getDayOfWeek(2002, 6, 1));
            System.out.println("1972. 1. 2 :" + getDayOfWeek(1972, 1, 2));
            System.out.println("2004. 5. 1 - 2004.4.28 :"

                                         + dayDiff("2004-05-01", "2004-04-28"));
            System.out.println("2004. 6. 10 - 2004.6.3 :"

                                         + dayDiff("2004-06-10", "2004-06-03"));

            System.out.println("2005. 6. 29 : "+convertDateToDay(2005, 6, 29));
            System.out.println("732126 : "+convertDayToDate(732126));
            System.out.println("2005. 6. 29 : "+convertDayToDate

                                                             (convertDateToDay(2005, 6, 29)));
            System.out.println("2005. 2. 28 : "+convertDayToDate

                                                             (convertDateToDay(2005, 2, 28)));
            System.out.println("2004. 2. 29 : "+convertDayToDate

                                                             (convertDateToDay(2004, 2, 29)));
            System.out.println("2001. 12. 31 : "+convertDayToDate

                                                          (convertDateToDay(2001, 12, 31)));   

            System.out.println("2002. 1. 1 : "+convertDayToDate

                                                              (convertDateToDay(2002, 1, 1)));
      }

            // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
      public static int[] endOfMonth =

                                              {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

      public static boolean isLeapYear(int year)

      {
            return ((year%4==0)&&(year%100!=0)||(year%400==0));
      }

      public static int dayDiff(String fromDate, String toDate)

      {
            int year1=0, month1=0, day1=0;
            int year2=0, month2=0, day2=0;

            String[] date1 = fromDate.split("-");
            String[] date2 = toDate.split("-");

            year1 = Integer.parseInt(date1[0]);
            month1 = Integer.parseInt(date1[1]);
            day1 = Integer.parseInt(date1[2]);

            year2 = Integer.parseInt(date2[0]);
            month2 = Integer.parseInt(date2[1]);
            day2 = Integer.parseInt(date2[2]);

            int fromDay = convertDateToDay(year1, month1, day1);
            int toDay = convertDateToDay(year2, month2, day2);
            return fromDay - toDay;
      }

      public static String convertDayToDate(int day)

      {

            int year=1;
            int month=0;

            int numOfLeapYear =0; // 윤년의 수

            while(true)

            {
                  int aYear = isLeapYear(year)? 366 :365;
                  if (day > aYear )

                  {
                        day-= aYear;
                        year++;
                  }

                  else

                  {
                        break;
                  }
            }

            if (day > 0)

            {
                  while(true)

                  {
                        int endDay = endOfMonth[month];
                        if(isLeapYear(year) && month == 1) endDay++;      

                        // 윤년이고 윤달이 포함되어 있으면, 1일을 더 뺀다.

                        if(day > endDay)

                        {
                              day -= endDay;
                              month++;
                        }

                        else

                        {
                              break;                        
                        }
                  }
            } // if

            return year+"-"+(month+1)+"-"+day;
      }

      public static int convertDateToDay(int year, int month, int day)

      {
            int numOfLeapYear =0; // 윤년의 수

            // 전년도까지의 윤년의 수를 구한다.
            for(int i=1;i < year; i++)

            {
                  if(isLeapYear(i))
                        numOfLeapYear++;
            }

            // 전년도까지의 일 수를 구한다.
            int toLastYearDaySum = (year-1) * 365 + numOfLeapYear;

            // 올해의 현재 월까지의 일수 계산
            int thisYearDaySum =0;

            for(int i=0; i < month-1; i++)

            {
                  thisYearDaySum+=endOfMonth[i];
            }

            // 윤년이고, 2월이 포함되어 있으면 1일을 증가시킨다.
            if (month > 2 && isLeapYear(year))

            {
                  thisYearDaySum++;
            }

            thisYearDaySum+=day;

            return toLastYearDaySum+thisYearDaySum;
      }


      public static int getDayOfWeek(int year, int month, int day)

      {
            // 0~6의 값을 반환한다. 결과가 0이면 일요일이다.
            return convertDateToDay(year, month, day)%7;
      }
}

/*

    오늘이 올해의 몇주차인지 계산하는 방법은 올해 1월 1일을 일로 바꾼것과

    오늘의 날짜를 일로 바꾼 것의 차이를 구하면(정확히는 하루를 빼주어야함)

    오늘이 올해의 몇일 째인지를 구할수 있죠. 그 차이를 day라고 할때

     (day + 요일값) / 7 + ((day + 요일값) / 7 == 0)? 0: 1하면 됩니다.

 

    여기서 요일 값은 0~6의 값이며, 일요일은 0이고 토요일이 6입니다.

*/