[자바의 정석] 10장 날짜와 시간 & 형식화


1 . 날짜와 시간

1.1 Calendar와 Date

Calendar와 GregorianCalendar

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

// getInstance() 메서드는 Calendar 클래스를 구현한 클래스의 인스턴스를 반환한다.
Calendar cal = Calendar.getInstance();
  • getInstance()는 시스템의 국가와 지역설정을 확인해서 태국을 제외하고는 GregorianCalendar의 인스턴스를 반환한다.

Date와 Calendar간의 변환

  1. Calendar를 Date로 변환
Calendar cal = Calendar.getInstance();
Date d = cal.getTime();
  1. Date를 Calendar로 변환
Date d = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(d);
  • getInstance()를 통해서 얻은 인스턴스는 기본적으로 현재 시스템의 날짜와 시간에 대한 정보를 담고 있다.
  • int get(int field)는 원하는 필드의 값을 얻어오는 Calendar의 메서드이다.
  • get(Calendar.MONTH)로 얻어오는 값의 범위가 1에서 12가 아니라 0~11이라는 것을 주의해야 한다. 얻어오는 값이 0이면 1월을 의미한다.
  • get메서드의 매개변수로 사용되는 Int값들은 Calendar에 정의된 static상수이다.
  • 날짜와 시간을 원하는 값으로 변경하려면 set메서드를 사용하면 된다.
void set(int field, int value)
void set(int field, int value, int date)
void set(int field, int value, int date, int hourOfDay, int minute)
void set(int field, int value, int date, int hourOfDay, int minute, int second)
  • 두 날짜간의 차이를 구하기 위해서는 두 날짜를 최소단위인 초단위로 변경한 다음 그 차이를 구하면 된다.
    • getTimeInMillis()는 1/1000초 단위로 값을 반환하기 때문에 초단위로 얻기 위해서는 1000으로 나눠 주어야 한다.
    • 일단위로 얻기 위해서는 246060*1000으로 나누어야 한다.
  • add(int field, int amount)를 사용하면 지정한 필드의 값을 원하는 만큼 증가 또는 감소 시킬 수 있다.
    • 이를 이용해서 특정 날짜 또는 시간을 기점으로 해서 일정기간 전후의 날짜와 시간을 알아낼 수 있다.
    • 다음 달의 1일에서 하루를 빼면 이번 달의 마지막 일을 알 수 있다.
  • roll(int field, int amount)도 지정한 필드의 값을 증가 또는 감소시킬 수 있는데, add 메서드와의 차이점은 다른 필드에 영향을 미치지 않는다는 것이다.

2. 형식화 클래스

날짜를 형식에 맞게 출력하기 위한 방법을 제공해주는 클래스

  • 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화하였다.
  • 데이터를 정의된 패턴에 맞춰 형식화할 수 있을 뿐만 아니라 역으로 형식화된 데이터에서 원래의 데이터도 얻어낼 수 있다.

2.1 DecimalFormat

형식화 클래스 중에서 숫자를 형식화 하는데 사용되는 것

  • 숫자 데이터를 정수, 부동소수점, 금액 등의 다양한 형식으로 표현할 수 있다.
  • 반대로 일정한 형식의 텍스트 데이터를 숫자로 쉽게 변환하는 것도 가능하다.
    형식화 클래스에서는 패턴을 정의하는 것이 중요하다.

DecimalFormat을 사용하는 방법

  1. 원하는 출력형식의 패턴을 작성하여 DecimalFormat인스턴스를 생성한다.
  2. 출력하고자 하는 문자열로 format메서드를 호출하면 원하는 패턴에 맞게 변환된 문자열을 얻게 된다.
double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0");
String result = df.format(number);		//1.2E6
  • parse메서드를 이용하면 기호와 문자가 포함된 문자열을 숫자로 쉽게 변환할 수 있다.
DecimalFormat df = new DecimalFormat("#,###.##");
DecimalFormat df2 = new DecimalFormat("#,###E0");

try {
	Number num = df.parse("1,234,567.89");
	double d = num.doubleValue();		// 1234567.89  문자열에서 숫자로 변환
	df2.format(num);			// 1.235E6	다른 형식으로 형식화
} catch (Exception e) {}			// parse() 메서드는 예외처리를 해줘야 한다.

2.2 SimpleDateFormat

날짜 데이터를 원하는 형태로 다양하게 출력하는 것을 도와주는 클래스

SimpleDateFormat을 사용하는 방법

  1. 원하는 출력형식의 패턴을 작성하여 SimpleDateFormat인스턴스를 생성한다.
  2. 출력하고자 하는 Date인스턴스를 가지고 format(Date d)를 호출하면 지정한 출력형식에 맞게 변환된 문자열을 얻게 된다.
Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

String result = df.format(today);	// 오늘 날짜를 yyyy-MM-dd형태로 변환하여 반환한다.
  • parse(String source)를 사용하여 날짜 데이터의 출력형식을 변환하는 방법
DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");

try {
	Date d = df.parse("2015년 11월 23일");
	df2.format(d);			// 2015/11/23
} catch (Exception e) {}
  • SimpleDateFormat의 parse(String source)는 문자열source를 날짜Date인스턴스로 변환해준다.

parse(String source)는 SimpleDateFormat의 조상인 DateFormat에 정의되어 있다.
지정된 형식과 입력된 형식이 불일치하는 경우에는 예외가 발생하므로 적절한 예외처리가 필요하다.

2.3 ChoiceFormat

특정 범위에 속하는 값을 문자열로 변환해준다.

double[] limits = {60, 70, 80, 90};
String[] grades = {"D", "C", "B", "A"};

int[] scores = {100, 95, 88, 70, 52, 60, 70};

ChoiceFormat form = new ChoiceFormat(limits, grades);

for(int i=0; i<scores.length; i++) {
	System.out.println(form.format(scores[i]));	// 각 점수에 맞게 등급 문자열 반환
}
  • limits은 경계값을 저장하는데 사용하였고, grades는 범위에 포함된 값을 치환할 문자열을 저앟나느데 사용되었다.
  • 경계값은 double형으로 반드시 모두 오름차순으로 정렬되어 있어야 하며, 치환 될 문자열의 개수는 경계값에 의해 정의된 범위의 개수와 일치해야한다.

패턴을 사용한 방법

String pattern = "60#D|70#C|80<B|90#A";
ChoiceFormat form = new ChoiceFormat(pattern);
  • 배열 대신 패털을 사용해서 보다 간결하게 처리할 수 있다.
  • 패턴은 구분자로 '#''<' 두 가지를 제공하는데 'limit#value'의 형태로 사용한다.
  • '#'는 경계값을 범위에 포함시키지만, '<'는 포함시키지 않는다.

2.4 MessageFormat

데이터를 정해진 양식에 맞게 출력할 수 있도록 도와준다. 데이터가 들어갈 자리를 마련해 놓은 양식을 미리 작성하고 프로그램을 이용해서 다수의 데이터를 같은 양식으로 출력할 때 사용하면 좋다.

String msg = "Name: {0} \nTel: {1} \nAge:{2} \nBirthday:{3}";
Object[] arguments = {
	"이자바", "02-123-1234", "27", "07-09"
};

String result = MessageFormat.format(msg, arguments);
  • MessageFormat에 사용할 양식인 문자열 msg를 작성할 때 ‘{숫자}’로 표시된 부분이 데이터가 출력될 자리이다.
  • 이 자리는 순차적일 필요는 없고 여러 번 반복해서 사용할 수도 있다.
String pattern = "INSERT INTO CUST_INFO VALUES ({0}, {1}, {2}, {3});";
MessageFormat mf = new MessageFormat(pattern);

Object[] obj = mf.parse(데이터);
  • parse(String source)를 이용해서 출력된 데이터로부터 필요한 데이터만을 뽑아낼 수도 있다.

태그:

카테고리:

업데이트: