[JAVA] Calendar 클래스 & 형식화

:-)·2022년 5월 5일
0

☕ 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);
		
	}

}

👉 실행결과

2022050517191220220505일 오후 051912

✍ 코드 예시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("-----------------------------");
		
	}

}

👉 실행결과

20220505213644-----------------------------
20220813213644-----------------------------
19470813213644-----------------------------
19470814063644-----------------------------
19480414063644-----------------------------



날짜 & 시간 설정하기

  • 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);
		
	}

}

👉 실행결과

2022050521110020200505153033198206171530331982061701020319820601010203

✍ 코드 예시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개의 댓글