[JAVA] Calendar 클래스 & 형식화

:-)·2022년 5월 5일

☕ JAVA

목록 보기
14/15
post-thumbnail

📝 Calendar 클래스

  • Date 클래스처럼 날짜와 시간을 다루는 클래스이다.
  • java.util 패키지에 포함되어 있다.

Calendar 클래스는 추상클래스이기 때문에 직접 객체를 생성할 수 없고,
메서드를 통해서 완전히 구현된 클래스의 인스턴스를 얻어야 한다.

// 캘린더 객체의 생성 -> 싱글톤 객체
Calendar cal = Calendar.getInstance();
  • getInstance()메서드는 Calendar클래스를 구현한 클래스의 인스턴스를 반환한다.



Calendar 클래스의 주요 상수

Calendar 객체를 얻었다면 get() 메서드를 이용해서 날짜와 시간에 대한 정보를 읽을 수 있다.

  • get() 메서드의 매개변수로 사용되는 int값들은 Calendar에 정의된
    static상수이다.

상수설명
YEAR년도
MONTH월

값의 범위는 0 ~ 11이기 때문에 0이면 1월을 의미한다.
DAY_OF_MONTH일
DAY_OF_WEEK요일

일 = 1 ~ 토 = 7
AM_PM오전_오후

0 : 오전, 1: 오후
HOUR시간 (0~11)
HOUR_OF_DAY시간 (0~23)
MINUTE분
SECOND초
DATE이 달의 마지막 일

✍ 코드 예시)

import java.util.Calendar;

public class Main01 {

	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance();
		
		// 년, 월, 일, 시, 분, 초 >> 24시간제
		int yy = cal.get(Calendar.YEAR);
		int mm = cal.get(Calendar.MONTH) + 1;
		int dd = cal.get(Calendar.DAY_OF_MONTH);
		int hh = cal.get(Calendar.HOUR_OF_DAY);
		int mi = cal.get(Calendar.MINUTE);
		int ss = cal.get(Calendar.SECOND);
		
		System.out.printf("%04d년 %02d월 %02d일 %02d시 %02d분 %02d초\n"
						,yy, mm, dd, hh, mi, ss);
		
		// 년, 월, 일, 시, 분, 초 >> 12시간제
		yy = cal.get(Calendar.YEAR);
		mm = cal.get(Calendar.MONTH) + 1;
		dd= cal.get(Calendar.DAY_OF_MONTH);
		hh = cal.get(Calendar.HOUR);
		mi = cal.get(Calendar.MINUTE);
		ss = cal.get(Calendar.SECOND);
		
		// 오전(=0), 오후(=1)
		int ampm = cal.get(Calendar.AM_PM);
		String[] apName = {"오전", "오후"};
        
		System.out.printf("%04d년 %02d월 %02d일 %s %02d시 %02d분 %02d초\n"
						,yy, mm, dd, apName[ampm], hh, mi, ss);
		
	}

}

👉 실행결과

2022년 05월 05일 17시 19분 12초
2022년 05월 05일 오후 05시 19분 12초

✍ 코드 예시2)

import java.util.Calendar;

// 캘린더 클래스를 파라미터로 전달받아, 그 객체가 포함하고 있는
// 시간을 출력하는 메서드
public class DatePrinter {
	
	public static void printDateTime(Calendar cal) {
		
		int yy = cal.get(Calendar.YEAR);
		int mm = cal.get(Calendar.MONTH) + 1;
		int dd = cal.get(Calendar.DAY_OF_MONTH);
		int hh = cal.get(Calendar.HOUR_OF_DAY);
		int mi = cal.get(Calendar.MINUTE);
		int ss = cal.get(Calendar.SECOND);
		
		System.out.printf("%04d년 %02d월 %02d일 %02d시 %02d분 %02d초\n"
						,yy, mm, dd, hh, mi, ss);
		
	}
	
}
import java.util.Calendar;

public class Main0 {

	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance();
		DatePrinter.printDateTime(cal);
		System.out.println("-----------------------------");
		
		// 지금으로 부터 100일 후 
		cal.add(Calendar.DAY_OF_MONTH, 100);
		DatePrinter.printDateTime(cal);
		System.out.println("-----------------------------");
		
		// 75년 전
		cal.add(Calendar.YEAR, -75);
		DatePrinter.printDateTime(cal);
		System.out.println("-----------------------------");
		
		// 9시간 후
		cal.add(Calendar.HOUR, 9);
		DatePrinter.printDateTime(cal);
		System.out.println("-----------------------------");
		
		// 8달 후
		cal.add(Calendar.MONTH, 8);
		DatePrinter.printDateTime(cal);
		System.out.println("-----------------------------");
		
	}

}

👉 실행결과

2022년 05월 05일 21시 36분 44초
-----------------------------
2022년 08월 13일 21시 36분 44초
-----------------------------
1947년 08월 13일 21시 36분 44초
-----------------------------
1947년 08월 14일 06시 36분 44초
-----------------------------
1948년 04월 14일 06시 36분 44초
-----------------------------



날짜 & 시간 설정하기

  • set메서드

    날짜와 시간을 원하는 값으로 변경하려면 set메서드를 사용하면 된다.

✍ 코드 예시)

import java.util.Calendar;

public class Main {

	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance();
		DatePrinter.printDateTime(cal);
		
		// 특정 날짜로 지정
		cal.set(Calendar.YEAR, 2020);
		cal.set(Calendar.MONTH, 4);		// month는 0부터 시작해서 4로 했으면 5월이다.
		cal.set(Calendar.DAY_OF_MONTH, 5);
		cal.set(Calendar.HOUR_OF_DAY, 15);
		cal.set(Calendar.MINUTE, 30);
		cal.set(Calendar.SECOND, 33);
		DatePrinter.printDateTime(cal);
		
		// 특정 날짜로 지정(또 다른 방법)
		cal.set(1982, 5, 17);
		DatePrinter.printDateTime(cal);
		
		// 특정 날짜로 지정(또 다른 방법> 시, 분, 초 포함 / 24시간제만 가능)
		cal.set(1982, 5, 17, 1, 2, 3);
		DatePrinter.printDateTime(cal);
		
		// 년, 월, 시, 분, 초는 가만히 두고, 날짜만 1일로 변경하는 경우
		cal.set(Calendar.DAY_OF_MONTH, 1);
		DatePrinter.printDateTime(cal);
		
	}

}

👉 실행결과

2022년 05월 05일 21시 11분 00초
2020년 05월 05일 15시 30분 33초
1982년 06월 17일 15시 30분 33초
1982년 06월 17일 01시 02분 03초
1982년 06월 01일 01시 02분 03초

✍ 코드 예시2)

import java.util.Calendar;

public class Main04 {

	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance();
		
		// 요일에 해당하는 인덱스 (일 = 1 ~ 토 = 7)
		int day = cal.get(Calendar.DAY_OF_WEEK);
		System.out.println("요일 인덱스 = " + day);
		
		// 요일을 출력하기
		String[] day_name = {"일", "월", "화", "수", "목", "금", "토"};
		System.out.println("요일 = " + day_name[day - 1]);
		
		// 이번 달은 몇 주로 되어 있는가?
		int week_count = cal.getActualMaximum(Calendar.WEEK_OF_MONTH);
		System.out.println("이번 달은 " + week_count + "주로 되어 있다.");
		
		// 이번 달은 몇 일까지 있는가?
		int day_count = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
		System.out.println("이번 달은 " + day_count + "일 까지 있다.");
		
		// 이번 달은 무슨 요일부터 시작하는가?
		cal.set(Calendar.DAY_OF_MONTH, 1);
		int first_day = cal.get(Calendar.DAY_OF_WEEK);
		System.out.println("이번 달의 시작 요일 인덱스 = " + first_day);
		System.out.println("이번 달의 시작 요일 = " + day_name[first_day - 1]);
		
	}

}

👉 실행결과

요일 인덱스 = 5
요일 = 목
이번 달은 5주로 되어 있다.
이번 달은 31일 까지 있다.
이번 달의 시작 요일 인덱스 = 1
이번 달의 시작 요일 = 일





📝 형식화 클래스

  • 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 문자열로 표현할 수 있는 클래스이다.
  • java.text패키지에 포함되어 있다.

형식화 클래스는 데이터를 정의된 패턴에 맞춰 형식화 할 수 있을 뿐만 아니라
역으로 형식화된 데이터에서 원래의 데이터를 얻어낼 수도 있다.


DecimalFormat

  • 숫자 형식 클래스

  • DecimalFormat은 숫자 데이터를 원하는 형식으로 표현하기 위해서 패턴을 사용한다.

기호의미
010진수 (값이 없을 때는 0)
#10진수
.소수점
-음수부호
,단위 구분자
E지수 기호
;패턴구분자
%퍼센트
\u2030퍼밀 (퍼센트 * 10)
\u00A4통화기호
'escape문자

DecimalFormat 사용 방법

  • 적용할 패턴을 작성하여 DecimalFormat 생성자 매개값으로 지정해서 객체를 생성한 다음,
  • format() 메서드를 호출하면 패턴이 적용된 문자열을 얻을 수 있다.

✍ 코드 예시)

import java.text.DecimalFormat;

public class Main {

	public static void main(String[] args) {
		
		double num = 1234567.89;
		
		DecimalFormat df = new DecimalFormat("#,###.0");
		String result = df.format(num);
		
		System.out.println(result);
		
	}

}

👉 실행결과

1,234,567.9



SimpleDateFormat

  • 날짜 형식 클래스

  • 날짜를 원하는 형식으로 표현하기 위해서 패턴을 사용한다.

기호의미
G연대 (BC, AD)
y년도
M월 (1~12 또는 1월~12월)
w년의 몇 번째 주 (1~53)
W월의 몇 번째 주 (1~5)
D년의 몇 번째 일 (1~366)
d월의 몇 번째 일( 1~31)
F월의 몇 번째 요일 (1~5)
E요일
a오전/오후 (AM,PM)
H시간 (0~23)
k시간 (1~24)
K시간 (0~11)
h시간 (1~12)
m분 (0~59)
s초 (0~59)
S천분의 일초 (0~999)
zTime zone (General time zone)

ex) GMT+9:00
ZTime zone (RFC 822 time zone)

ex) +0900
'escape문자 (특수문자를 표현하는데 사용)

SimpleDateFormat 사용 방법

  • 적용할 패턴을 작성하여 SimpleDateFormat 생성자 매개값으로 지정해서 객체를 생성한 다음,
  • format(Date d)를 호출하면 지정한 출력형식에 맞게 변환된 문자열을 얻을 수 있다.

✍ 코드 예시)

import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {

	public static void main(String[] args) {
		
		Date today = new Date();
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd \n오늘은 올 해의 w번째 주입니다.");
		String result = sdf.format(today);
		
		System.out.println(result);
	}

}

👉 실행 결과

2022-05-06 
오늘은 올 해의 19번째 주입니다.



MessageFormat

  • 문자열 형식 클래스

  • MessageFormat 클래스를 사용하면 문자열에 데이터가 들어갈 자리를
    표시해 두고, 프로그램이 실행하면서 동적으로 데이터를 삽입해
    문자열을 완성시킬 수 있다.

  • MessageFormat은 정적 format() 메서드를 호출해서 완성된 문자열을 리턴시킨다.

    • 메서드의 첫 번째 파라미터는 매개 변수화된 문자열을 지정,
      두 번째 이후 파라미터는 인덱스 순서에 맞게 값을 나열하면 된다.

✍ 코드 예시)

public class Main {

	public static void main(String[] args) {
		
		String id = "java";
		String name = "자바";
		String tel = "010-1234-1234";
		
		String text = "id : {0}, 이름 : {1}, 전화번호 : {2}";
		String result = MessageFormat.format(text, id, name, tel);
		
		System.out.println(result);
		
	}

}

👉 실행 결과

id : java, 이름 : 자바, 전화번호 : 010-1234-1234









참고자료 : <Java의 정석>, <이것이 자바다>

0개의 댓글