유난스런 개발 기록

[JAVA] Day-11 _ 캘린더 클래스와 데이트 클래스(Calendar Class & Date Class) 본문

개념정리/JAVA

[JAVA] Day-11 _ 캘린더 클래스와 데이트 클래스(Calendar Class & Date Class)

yourhwan 2023. 1. 23. 19:20

day-11

캘린더 클래스 (Calendar Class)

&

데이트 클래스(Date Class)


Calendar Class(캘린더 클래스)란 ? 

  • 자바에서 날짜를 나타낼 때는 Date, Calendar 를 사용한다.
  • Calendar 클래스는 Date 클래스를 조금 더 향상시켜 나온 것이다.
  • 간단한 날짜를 표현할 때는 Date 클래스가 나을 수 있다.
  • 하지만 두 개의 날짜 간의 연산을 할 경우 메소드기능이 더 많이 추가 된 Calendar 클래스가 더 나을 수 있다.

 

Calendar Class를 알아보기 전, 먼저 Date Class를 사용해보자.

 

Date Class

 

package my.day11.c.calendar;

import java.util.Date;
import my.util.MyUtil;

public class Calendar_main {

	public static void main(String[] args) {
    
    
    // === 1. Date 클래스를 사용하여 현재시각 나타내기 ===
    
    Date now = new Date(); // 현재시각
    
    System.out.println("현재시각1 : "+ now);
    // Tue Jan 17 09:28:10 KST 2023
    
    SimpleDateFormat sdfmt = new SimpleDateFormat("yyyy=MM-dd HH;mm:ss");
    //	System.out.println("현재시각2 : " sdfmt.format(now)); // 오류 확인해보기
    
    String currentTime = String.format("%tF %tT %tA %tZ", now, now, now, now);
    System.out.println("현재시각3 : " + currentTime);
    //2023-01-17 09:31:36 화요일 KST
    
    
    /*
	       <참고>
	         날짜 타입 format         설명
	        --------------------------------------------------
	         %tF              날짜를 yyyy-mm-dd 형식으로 포맷해주는 것
	         %tT              날짜의 시각을 HH:MM:SS 형식으로 포맷해주는 것  
	         %tp              오전, 오후를 출력
	         %tA              요일명 출력
	         %tY              4자리 년도만 출력
	         %tB              월의 이름(January, February ...)출력
	         %tm              월의 01,02,03 ~~ 10,11,12 로 출력
	         %td              일수를 1~31 로 출력
	         %te              %td와 동일함
	         %tk              시간을 0~23 으로 출력
	         %tl              시간을 1~12 으로 출력
	         %tM              분을 00~59 으로 출력
	         %tS              초를 00~59 으로 출력
	         %tZ              타임존을 출력(한국은 KST로 나옴).
	      */
    		
	}// end of main()--------------------------------------


}

 

위와 같이 Date Class를 통해 다양한 타입의 현재시간 알아보기를 코드로 작성해봤다.

날짜 타입 format에 적어 둔 것처럼 출력하고자 하는 내용을 format에서 찾아 넣어주면 된다.

 

이번에는 Calendar Class를 사용해보자.

 

Calendar Class

package my.day11.c.calendar;

import java.text.SimpleDateFormat;

public class Calendar_main {

	public static void main(String[] args) {
    
    
Calendar currentDate = Calendar.getInstance();
// 현재 날짜와 시간을 얻어온다.
		
int year = currentDate.get(Calendar.YEAR);
//	int month = currentDate.get(Calendar.MONTH); // 0 ~ 11
int month = currentDate.get(Calendar.MONTH)+1; // 1 ~ 12
// 월의 경우 +1을 꼭 해줘야 한다.

    
    	}// end of main()--------------------------------------


}

 

사실 사용법엔 크게 어려움이 없을 것이다.

다만 신경을 써줄 부분은

CaledarMONTH를 받아올 때 +1을 꼭 해줘야 한다는 것이다.

왜냐하면

 get(Calendar.MONTH)로 얻어오는 값의 범위1~12아닌, 0~11 이기 때문이다.

 

해당 코드를 출력하면 블로그 업로드 날짜를 기준으로  1이 출력 된다.

하지만

대부분의 공식적인 문서나 프로그램에서는 일의 자리 숫자의 경우 앞에 "0"을 넣어서 표기해준다.

그렇다면 0은 어떻게 넣어줄까?

 

삼항연산자를 이용해보자

String str_month = (month < 10)?"0"+month:String.valueOf(month);
// 삼항연산자를 이용해 월 앞에 0을 붙여주자. String타입으로 바꿔줘서
// 값을 받아온 month가 10보다 작다면 String타입으로 변환해준 month앞에 0을 붙여 출력해준다는 코드다.

String 타입으로 형변환을 해주고, 삼항연산자를 이용해 새로운 변수에 담아 출력하면 된다.

 

몇가지를 더 출력해보자.

package my.day11.c.calendar;

import java.text.SimpleDateFormat;

public class Calendar_main {

	public static void main(String[] args) {
    
    Calendar currentDate = Calendar.getInstance();
	// 현재 날짜와 시간을 얻어온다.
		
	int year = currentDate.get(Calendar.YEAR);	
	// int month = currentDate.get(Calendar.MONTH); // 0 ~ 11
	
    int month = currentDate.get(Calendar.MONTH)+1; // 1 ~ 12
	// 월의 경우 +1을 꼭 해줘야 한다.
    
    
    String str_month = (month < 10)?"0"+month:String.valueOf(month);
    // 삼항연산자를 이용해 월 앞에 0을 붙여주자. String타입으로 바꿔줘서
    
    
		System.out.println("올 해의 년도 : " + year); // 올 해의 년도 : 2023
		
		System.out.println("월 : " + month); // 월 : 1
		System.out.println("월 : " + str_month); // 월 : 01
		
		System.out.println("이 해의 몇 째 주 : " + currentDate.get(Calendar.WEEK_OF_YEAR)); 
		// 이 해의 몇 째 주 : 3
		
		System.out.println("이 달의 몇 째 주 : " + currentDate.get(Calendar.WEEK_OF_MONTH)); 
		// 이 달의 몇 째 주 : 3
		
		// Calendar.DATE 와 Calendar.DAY_OF_MONTH 는 같은 것이다.
		System.out.println("이 달의 몇 일 : " + currentDate.get(Calendar.DATE));
		// 이 달의 몇 일 : 17
		System.out.println("이 달의 몇 일 : " + currentDate.get(Calendar.DAY_OF_MONTH));
		// 이 달의 몇 일 : 17

		int day = currentDate.get(Calendar.DATE);
		String str_day = (day < 10)?"0"+day:String.valueOf(day);
		System.out.println("이 달의 몇 일 : " + str_day);
		// 이 달의 몇 일 : 17
		
		System.out.println("이 해의 몇 일 : " + currentDate.get(Calendar.DAY_OF_YEAR));
		// 이 해의 몇 일 : 17		
		// 만약에 currentDate 값이 2023년 2월 1일 이라면 이 해의 몇 일 " 32 라고 나온다.
		
		// 1:일요일 2:월요일 3:화요일 4:수요일 5:목요일 6:금요일 7:토요일
		System.out.println("요일 (1~7, 1:월요일) : "+ currentDate.get(Calendar.DAY_OF_WEEK) );
		// 요일 (1~7, 1:월요일) : 3
		
		
		
		String dayname = "";
			switch ( currentDate.get(Calendar.DAY_OF_WEEK)) {
			case 1: 
				dayname = "일";
				break;
			
			case 2: 
				dayname = "월";
				break;
			
			case 3: 
				dayname = "화";
				break;
			
			case 4: 
				dayname = "수";
				break;
			
			case 5: 
				dayname = "목";
				break;
			
			case 6: 
				dayname = "금";
				break;
			
			case 7: 
				dayname = "토";
				break;
	
			default:
				break;
			}
		
		System.out.println("오늘은 " + dayname + "요일 입니다.");
		// 오늘은 화요일 입니다.
		
		System.out.println("오전_오후(0:오전, 1:오후): " + currentDate.get(Calendar.AM_PM)); // 0
	    System.out.println("시간(0~11): " + currentDate.get(Calendar.HOUR)); //  10
	    System.out.println("시간(0~23): " + currentDate.get(Calendar.HOUR_OF_DAY)); // 10 밤 10시면 22로 나옴
	    System.out.println("분(0~59): " + currentDate.get(Calendar.MINUTE)); // 31
	    System.out.println("초(0~59): " + currentDate.get(Calendar.SECOND)); // 45
	    System.out.println("1000분의 1초(0~999): " + currentDate.get(Calendar.MILLISECOND)); // 395
	    
	    // 천분의 1초를 시간으로 표시하기 위해 3600000으로 나누었다.(1시간 = 60 * 60초)
	    System.out.println("TimeZone(-12~+12): " + (currentDate.get(Calendar.ZONE_OFFSET)/(60*60*1000))); // 9 
	    
	    // 이 달의 마지막 일을 찾는다.
	    System.out.println("이 달의 마지막 날: " + currentDate.getActualMaximum(Calendar.DATE) ); // 31
    
    
    
    	}// end of main()--------------------------------------

}

 

이 부분도 크게 어려운 것이 없다.

다만 주의해야할 점은 DAY_OF_WEEK의 경우 숫자로 결과를 출력해주는데,

1(일요일) ~ 7(토요일) 이 기준이다.

때문에 switch문으로 출력될 값을 만져준 것이다.

위의 여러 메소드 기능들을 통해 우리가 원하는 양식으로 날짜를 출력할 수 있다.

(우리가 직접 자주 쓰는 메소드 들을 모아 새로운 날짜출력 메소드를 만들면 프로젝트를 할 때 편할수도?)

 

어제의 시간 내일의 시간도 출력할 수 있다.

package my.day11.c.calendar;

import java.text.SimpleDateFormat;

public class Calendar_main {

	public static void main(String[] args) {


SimpleDateFormat sdformt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cur_Date = Calendar.getInstance();
		
// === 어제시각 나타내기 ===

cur_Date.add(Calendar.DATE, -1);
System.out.println("어제시각 => " + sdformt.format(cur_Date.getTime()));
// 어제시각 => 2023-01-16 11:35:42
		
// === 현재시각 나타내기 ===

cur_Date = Calendar.getInstance();
System.out.println("현재시각 => " + sdformt.format(cur_Date.getTime()));
// currentDate.getTime() 는 Calendar를 SimpleDateFormat 으로 바꿔준다.
// 현재시각 => 2023-01-17 11:35:42
		
// === 내일시각 나타내기 ===

cur_Date.add(Calendar.DATE, +1);
System.out.println("내일시각 => " + sdformt.format(cur_Date.getTime()));
// 내일시각 => 2023-01-18 11:35:42


	}// end of main()--------------------------------------


}

 

간단하다!!!

심지어 지정해준 날짜와 시간도 얻을 수 있다.

SimpleDateFormat sdformt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cur_Date = Calendar.getInstance();
		
System.out.println("현재시각 => " + sdformt.format(cur_Date.getTime()));
		
		
System.out.println("현재시각으로 부터 1개월 2일 3시간 4분 5초 후 ");
cur_Date.add(Calendar.MONTH, 1);
cur_Date.add(Calendar.DATE, 2);
cur_Date.add(Calendar.HOUR, 3);
cur_Date.add(Calendar.MINUTE, 4);
cur_Date.add(Calendar.SECOND, 5);
System.out.println(sdformt.format(cur_Date.getTime()));

 

오늘은 Calendar Class에 대해서 알아봤다. (Date Class도 약간)

다른 클래스와 메소드에 비해 훨씬 간단하기 때문에

더 재미있게 느껴지지 않았나싶다.