본문 바로가기

JAVA

[Java] 수업 정리 23 Calender(날짜와 시간) 내일, 월말, 월초, 년말, 년초, 윤년 구하기 (24.11.19)

1980년 1월 1일 (화요일)을 기준으로 지정해준 날짜까지(윤년 포함) 총합을 계산한다

그리고 7로 나눠서 요일을 구한다.

 

public class Calender {
                                     //미리 기준 연도와, 기준월을 정해서 출력하는 방버을 선택함.
           int base_year = 1980          // 기준 연도
           int base_month = 1;             // 기준 월. 실제로는 1980년 1월 1일 기준으로 계산
           int total_sum = 0                // 기준 년과 월에서 입력받은 날짜까지 총일수를 여기에 저장
           
           int[ ] month_table = new int[ ] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };       // 각 월마다 총 일수



                 public int is_leap_year(int n)                       // 윤년이 있는 년도를 조사하는 함수. 윤년인 경우는 1
                            if (n % 4 == 0) {                                   // 4의 배수는 윤년
                                        if ( n % 100 == 0) {                  // 그런데 100의 배수는 윤년이 아님
                                                     if ( n % 400 == 0     // 그 중에서 400의 배수는 윤년
                                                                  return 1
                                                     return 0;
                                        } return 1;
                            } else
                                          return 0;
                  }



                 public int total_to_month(int total) {                  // 기준 날짜부터 입력받은 날짜까지 총 일수를 구해서 반환,
                            boolean CHK = false;                            // 무한 루프를 돌리기위한 boolean 값.
                            int i = 0;                                                 // i 변수는 월.
                            int cnt = 0;                                             // 총 일수를 월로 바꿔서 cnt 저장.
                            int chk_leap_year = base_year;           // 총 일수를 월로 바꾸려면 윤년이 있는날을 고려해야 함.
                                                                                         // 기준 연도부터 시작해서 윤년을 조사함.


                            whlie(CHK != true) {
                                     if (is_leap_year(chk_leap_year) == 1    // 만약 지금 연도가 윤년이라면
                                            month_table [1] = 29;                     // 2월달은 하루가 더 늘어납니다.
                                     if (total >= month_table[ i ] ) {             // 총 일수가 month_table[ ] 배열의 총일수 보다 작다면,
                                            total -= month_table [ i++];        // 총일수를 month_table 배열의 현재 월의 일수로 빼줍니다.
                                                                                            // 그리고 i 를 증가시킵니다. 즉 다음달로 증가됩니다.
                                            cnt++;                                    // 그리고 월이 증가합니다
                                            if ( i == 12) {                         // 만약 12월이 된다면 계절이 변해 다시 제자리로 오는 것처럼
                                                   i -= 12                        // 다시 12를 빼서 0으로 만들어줌.

                                                   cnk_leap_year++;      // 그리고 12개월이 지났으니 연도도 증가시켜줘야 함.

                                            } month_table[1]=28      // 윤년을 평년의 해로 바꿔줘야 함.

                                     } else break;

                             } cnt %= 12                      // 위의 무한루프롤 통해 총 일수를 총월수로 계산됨.
                                                                       // 이제 12 나머지 연산을 해주면 "몇년도 몇월"이라는 값으로 바꿀수 있음

                            return (cnt+1);                    // 그리고 바꾼 월을 반환
                  }

                  public int count_leap(int n) {        // 기준 연도부터 시작해서 입력받은 연도까지의 윤년이 있는 날을 셈.
                             int i ;                                  // 기준연도를 저장.
                             int cnt = 0;                         // 윤년의 개수
                         
                              for ( i = base_year; i < (base_year-n); i++) {
                                    // i (기준연도) 부터 입력받은 연도까지 i 를 증가시키며 윤년이 낀 갯수를 구함.

                                           if (is_leap_year( i ) == 1) {              // 위에서 구현한 윤년인지를 판단하는 함수를 사용
                                                    cnt++;                                    // 윤년이라면 총 윤년의 개수를 증가시킴.
                                           }
                              } return cnt                                                // 카운트한 윤년의 갯수를 리턴
                  }

                  public void convert_to_day(int nYear) {              // 기준 연도부터 입력받은 연도까지 총일수를 구해서 리턴.
                             total_sum =(( nYear - base_year ) * 365) + count_leap (( base_year - nYear ));
                  }


                  void result(int nYear, int mth) { 
                          int i , j                              // 카운트를 위한 변수
                          int d=0;
                          int year=0;
                          int month;
                          int sum=0;

                          int dy = count_leap(base_year-nYear);                  // dy는 기준연도부터 현재연도까지 낀 윤년의 개수
                          convert_to_day(nYear);              // ★ 우선 기준연도부터 현재 연도까지 년 단위로 총일수를 구합니다★

                          int day           // 이 변수는 요일을 결정하기 위해 존재. 예를들어 기준일 부터 현재일까지 차이가 7이고
                                                 // 기준일이 월요일이면 7로 나눠서 나머지가 0이 되니까 월요일임을 알수 있듯이
                                                 // day 는 숫자로서 요일을 결정할 수 있음.
                           if (nYear >= base_year) {

                                          if (is_leap_year(nYear) == 1                  // 윤달이 낀날의 2월은 하루 증가

                                                             month_table [1] = 29;

                                          for ( i =0; i < (mth - base_month ); i++)
                                                                total_sum += month_table [ i ] ;
                                                                // 위에 ★에서 기준연도부터 현재연도까지의 일수를 구 했습니다
                                                               // 이 for 루프를 통해 나머지 기준월부터 현재월까지의 총일수를 구합니다
                                                               // 즉, 이 루프를 통해 기준 연도와 월부터 현재 연도와 월까지의 총일수를 구함

                                          day = (total_sum+2) % 7;
                                // 현재까지의 총일수를 7의 나머지로 연산해줍니다. 2를 더해준 이유는 1980년도 1월 1일 = 화요일

                                          System.out.println("총 일수 = " + total_sum+ "윤달이 낀 숫자  = " + dy);
                                          month = total_to_month(total_sum);      // 입력받은 해당 날짜의 정확한 달을 구해서 저장

                                          System.out.println(+month+ "월의 달력");
 
                                        System.out.println("일 월 화 수 목 금 토");
                                          
                                         for ( i = 0; i < day; i++            // day 변수는 요일 입니다. 갯수만큼 /t로 공백을 만들어줍니다
                                                                System.out.println("/t");

                                          for ( j = 1; j <= month_table[month-1]; j+) {
                                                                        // month 변수에서 1을 빼준이유는 배열을 0부터 시작하기 때문
                                                                 System.out.println( j+ "/t");       // j 를 증가시켜가며 차례데로 날짜를 출력

                                                                 if ((( j+day) % 7) == 0) System.out.println( ) ;
                                                                       // 그리고 처음 요일을 출력하기위한 공백만큼 계산해서 출력
                                          } System.out.println( );
                                             month_table[1] = 28          // 윤년이었다면 다시 평년으로 바꿔줍니다.
                           }
                  }
}

 

 

import java.util.Scanner;

public class CalenderUser{
           public static void main(String args[ ]) {
                      int year, month;
                      
                      Scanner s = new Scanner(System.in);
                      Calender cldUser = new Calender( );
                      System.out.println("Year, Month");
                      year = s.nextInt( );
                      month = s.nexInt( );                     // 연도와 월을 입력받습니다.
                      cldUser.result(year, month);       // cldUser 클래스의 result 함수의 매개변수
                                                                        // year, month를 넘겨주면 cldUser 클래스가 결과를 출력
           }
}