[day13] java-basic : 날짜 관련 API

2 분 소요

날짜 관련 API 클래스

  • java.util.Date
  • java.util.Calendar
  • java.text.SimpleDateFormat

Date클래스

  • JDK 1.1 버전부터 Calendar클래스가 생겨나서 Deprecated됨
// 오늘 년,월,일 구하기
Date d = new Date();
System.out.println("d : " + d.toString()); 	// 왜 d를 찍으면 주소값이 안찍힐까? 
                                            // Date클래스에서 toString메소드를 override했기 때문이다.

// 연도 추출
int year = d.getYear() + 1900;			// 1900년 1월 1일부터 몇년째인지 결과를 반환한다.

// 월 추출
int month = d.getMonth() + 1;			// 0(1월) ~ 11(12월)을 출력한다.

// 일 추출
int date = d.getDate();

System.out.println("오늘은 "+ year + "년 " + month + "월 " + date + "일입니다.");
  • 왜 Date의 객체를 출력하면 주소값이 아니라 날짜정보가 출력될까?

    • 원래 print, println 메소드에서는 객체 값을 찍으라고하면 내부적으로 Object클래스의 toString()메소드를 호출한다. (객체.toString())

    • 이때 Object 클래스의 toString()메소드는 원래 클래스정보와 hashcode값을 반환한다.

    • 하지만 Date클래스에서는 toString()을 override해서 날짜 정보를 반환하라고 설정했기 때문에 날짜 정보가 출력되는 것이다.

    • 이와 마찬가지로 String클래스에서도 toString()을 override했기 때문에 문자열 값 자체를 출력할 수 있게 된 것이다.

Calendar클래스

  • Calendar클래스는 추상클래스이기 때문에 자체만으론 인스턴스 객체를 만들 수 없다.

  • 하지만 Calendar클래스의 객체를 만들기 위해서 Calendar클래스를 상속받은 자식 클래스의 객체를 생성하지 않는다.

  • 대신 Calendar에 static메소드인 getInstance()를 통해서 객체를 생성할 수 있다.

  • static Calendar getInstance() : 객체 얻기

  • int get(int calendarField) : 정보 추출

  • calendarField는 final 상수 변수이다.

  • int getActualMaximum(int calendarFeild) : 해당 월의 일수 반환

  • Calendar클래스의 get메소드로 오늘 날짜 구하기는 아래와 같다.

// 캘린더 객체 생성
Calendar c = Calendar.getInstance();
System.out.println(c); 	// java.util.GregorianCalendar


// 년
int year = c.get(1);						        // 1이라고 쓰면 직관적이지 않음
year = c.get(Calendar.YEAR);				    // Calendar클래스에 정의된 YEAR 상수 변수를 활용하면 직관적임

// 월
int month = c.get(2);
month = c.get(Calendar.MONTH) + 1;			// MONTH : 0 ~ 11

// 일
int date = c.get(3);
date = c.get(Calendar.DATE);	
date = c.get(Calendar.DAY_OF_MONTH);		// 변수 DAY_OF_MONTH나 DATE모두 상수값 5로 저장되어 있음

// 요일
int day = c.get(Calendar.DAY_OF_WEEK);	// 1(일요일) ~ 7(토요일)
String[] dayArr = {"","일", "월", "화", "수", "목", "금", "토"};

System.out.println(year + "-" + month + "-" + date +" (" + dayArr[day] + ")");
  • Calendar클래스의 get메소드와 set메소드를 활용하면 궁금한 날짜에 대한 정보를 알 수 있다.
// 2021년 5월 5일은 무슨 요일?
c.set(2021, 5-1, 5);					// MONTH : 0 ~ 11이므로 5월이 궁금하면 4를 매개변수로 넘겨줘야 한다.
day = c.get(Calendar.DAY_OF_WEEK);
System.out.println("2021-5-5은 " + dayArr[day] + "요일 입니다.");

// 5월의 마지막날이 몇일?
int lastday = c.getActualMaximum(Calendar.DATE);
System.out.println("5월은 " + lastday +"일이 마지막 날이다.");

// 2월의 마지막날이 몇일?
c.set(c.MONTH, 2-1);
lastday = c.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("2월은 " + lastday + "일로 구성되어 있습니다.");

SimpleDateFormat클래스

  • SimpleDateFomat(String patter)으로 객체를 생성한다.

  • 객체.format(Date 객체)로 Date 형식을 패턴에 맞게 바꿀 수 있다.

// 오늘 날짜 구하기
String pattern = "yyyy년 MM월 dd일(E) HH:mm:ss / hh:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(pattern);

String date = sdf.format(new Date());
System.out.println(date);
  • format 메소드의 매개변수는 Date 밖에 안된다.
  • 그래서 캘린더 객체의 getTime()메소드를 통해 얻어낸 값을 Date 데이터형의 객체로 만든 뒤 사용해야 한다.
// 캘린더 객체를 가지고 simpleDateFormat 사용하기
Calendar c = Calendar.getInstance();
Date d = c.getTime();

System.out.println(sdf.format(d));