JAVA(날짜와 시간, 형식화)

Hyeon_Su_Lee·2022년 1월 6일
0
post-custom-banner

Calender & Date

  • 날짜와 시간을 다루기위해 함께 많이 쓰이는 클래스
  • 추상 클래스로 getInstance()로 객체 생성
  • get, set메소드를 통해 시간 값을 얻어오거나 설정할 수 있다.

Date와 Calender간의 변화
Calender가 새로 추가되면서 Date는 대부분의 메서드가 'deprecated'되었으므로 잘 사용되지 않는다. 그럼에도 불구하고 Date를 필요로 하는 메서드들이 있기 때문에 Calender를 Date로 또는 그 반대로 변환할 일이 생긴다.

// Calendar를 Date로 변환
Calender cal = Calender.getInstance();
Date d = new Date(cal.getTimeInMillis()); // Date(long date)

// Date를 Calendar로 변환
Date d = new Date();
Calender cal = Calender.getInstance();
cal.setTime(d)

getInstance()를 통해 얻은 인스턴스는 기본적으로 현재 시스템의 날짜와 시간에 대한 정보를 담고있다.

자주 쓰이는 상수들

  • YEAR : 년도를 나타냄
  • MONTH : 월을 나타내고, 1월을 상수 0으로 대응하여 실제 월을 구할 때는 +1을 해줘야 함.
  • DATE, DAY_OF_MONTH : 월의 날짜를 의미
  • DAY_OF_WEEK : 일주일에 해당되는 요일을 의미. 일요일부터 시작이고 일요일의 값은 1 이다.
  • HOUR : 12시간 단위의 시간을 표시
  • HOUR_OF_DAY : 24시간 단위의 시간을 표시
  • MINUTE : 분을 의미하는 필드
  • SECOND : 초를 의미하는 필드
  • MILLISECOND : 밀리 세컨드 단위를 의미하는 필드

get메소드를 이용한 날짜 출력 예제

Calendar cal = Calendar.getInstance(); // getInstance()로 객체 생성

System.out.println("현재 날짜, 시간 : " + cal.getTime());
System.out.println("현재 날짜 : " + cal.get(Calendar.YEAR) + "년 " + (cal.get(Calendar.MONTH) + 1) + "월 " + cal.get(Calendar.DAY_OF_MONTH) + "일");
System.out.println(cal.get(Calendar.DAY_OF_WEEK)); // 요일 숫자 표시 (1은 일요일)
System.out.println(cal.get(Calendar.DAY_OF_YEAR)); // 일년중 몇 번째 날
System.out.println(cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND) + ":" + cal.get(Calendar.MILLISECOND)); // 현재 시간 (24시간 단위 밀리초 포함)
System.out.println(cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND)); // 현재 시간 (12시간 단위 밀리초 미포함)
System.out.println(cal.get(Calendar.WEEK_OF_YEAR)); // 1년중 몇 번째 주)

결과

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

set메소드를 이용한 날짜 수정 예제

Calendar cal = Calendar.getInstance(); // getInstance()로 객체 생성

System.out.println(cal.getTime());

cal.set(2021, Calendar.DECEMBER, 25, 23, 00, 00);
//       년               월      일  시  분   초
System.out.println(
        cal.get(Calendar.YEAR) + "년 " +
        (cal.get(Calendar.MONTH) + 1) + "월 " +
        cal.get(Calendar.DATE) + "일 " +
        cal.get(Calendar.HOUR_OF_DAY) + "시 " +
        cal.get(Calendar.MINUTE) + "분 " +
        cal.get(Calendar.SECOND) + "초");

결과



형식화 클래스

java.text패키지에 포함되어 있으며 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화 하였다.

DecimalFormat

  • 숫자를 형식화 하는데 사용된다
  • 숫자 데이터를 정수, 부동소수점, 금액 등의 다양한 형식으로 표현할 수 있다
  • 일정한 형식의 텍스트 데이터를 숫자로 쉽게 변환하는 것도 가능하다.
  • 원하는 형식으로 표현하기 위해 패턴을 정의

자주 사용되는 패턴

사용 방법

double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0");
String result = df.format(number);

DecimalFormat을 인스턴스화 해준 후 출력하고자 하는 문자열로 format메서드를 호출한다.

예제

DecimalFormat df = new DecimalFormat("0");
System.out.println(df.format(12345.6789));

df = new DecimalFormat("0,00.000");
System.out.println(df.format(12345.6789));

결과

12346
1,23,45.679

첫 줄의 출력값은 출력형식 패턴에 소수점을 넣어주지 않아서 0.6이 반올림 되어 12346이 출력이 되었다.
두번째 줄의 출력은 패턴에 단위구분자를 넣고 소수점 3번째 자리까지 출력으로 설정을해서 4번째자리가 반올림 되어 .679가 나온것을 볼 수 있다.


SimpleDateFormat
날짜 데이터를 간편하게 출력할 수 있게 해준다.

예제

Date today = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS a E요일");
System.out.println(sdf.format(today));

결과

Date 클래스를 인스턴스 후 내가 설정한 패턴에 맞게 날짜를 출력해준다

ChoiceFormat
특정 범위에 속하는 값을 문자열로 변환해 준다. 연속적 또는 불연속적인 범위 값들을 처리하는 데 있어서 if문과 switch문은 적절하지 못한 경우가 많다. 이럴 경우에 이 클래스를 사용한다.

예제

public static void main(String[] args) {
    double[] limits = {60, 70, 80, 90};
    // 낮은 값부터 큰 값의 순서대로 적어야 한다
    // limits, grades 간의 순서와 개수를 맞춰야 한다.
    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(scores[i] + ":" + from.format(scores[i]));
    }
}

결과

100:A
95:B
88:B
70:C
52:D
60:D
70:C

두 개의 배열이 사용되었는데 하나(limits)는 범위의 경계값을 저장하였고 또 하나(grades)는 범위에 포함된 값을 치환할 문자열을 저장하는데 사용되었다.

경계값은 double형으로 반드시 모두 오름차순으로 정렬되어 있어야 하며, 치환 될 문자열의 개수는 경계값에 의해 정의된 범위의 개수가 일치해야 한다. 그렇지 않으면 IllegalArgumentException이 발생한다.


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

예제

public static void main(String[] args) {
    String msg = "Name : {0} \nTel : {1} \nAge : {2} \nBirthday : {3}";

    Object[] arguments = {
            "이자바", "02-123-1234", "27", "07-09"
    };

    String result = MessageFormat.format(msg, arguments);
    System.out.println(result);
}

결과

Name : 이자바
Tel : 02-123-1234
Age : 27
Birthday : 07-09

msg변수를 작성할 때 {숫자}로 표시된 부분이 데이터가 출력될 자리이다. 이 자리는 순차적일 필요는 없고 여러 번 반복해서 사용할 수도 있다.

여기에 사용되는 숫자는 배열처럼 인덱스가 0부터 시작하며 양식에 들어갈 데이터는 객체배열인 arguments에 지정되어 있음을 알 수 있다.

profile
어제 보다 오늘 더 발전하는 개발자
post-custom-banner

0개의 댓글