language/java

10. 날짜와 시간 & 형상화

wooweee 2023. 3. 12. 22:43
728x90

1. calendar

  • 추상 클래스
  • 구현 객체: 서양력, 태국력, 음력
  • 구현 순서
    • getInstance() -> clear() -> set()

 

1.1. 주요 method

  1. getInstance(); 호출
    1. Calendar가 추상 클래스에서 getInstance를 통해서 구현 객체를 호출해야한다.

  2. clear(); 오차 제거를 위한 시간 초기화
    1. clear(); 모든 필드 초기화
    2. clear(Calendar.SECOND); 초 초기화 // 년, 월, 요일, 시간, 분 등 초기화 가능

  3. set(); 원하는 날짜 시간 지정
    1. void set(int field, int value); // 시간만 셋팅할 때는 이걸로만 지정해야함
    2. void set(int year, int month, int date);
    3. void set(int year, int month, int date, int hourOfDay, int minute);
    4. void set(int year, int month, int date, int hourOfDay, int minute, int second);

  4. get(); 필요한 부분 추출
    • 미리 지정된 상수 필드 존재
      1. 날짜
        YEAR, MONTH(0월부터 시작), WEEK_OF_YEAR, WEEK_OF_MONTH, DATE, DAY_OF_MONTH, DAY_OF_YEAR, DAY_OF_WEEK(일요일 부터 1~7), DAY_OF_WEEK_IN_MONTH

      2. 시간
        HOUR(0~11), HOUR_OF_DAY(0~23), MINUTE, SECOND, MILLISECOND, ZONE_OFFSET(gmt 기준 시차), AM_PM(오전/오후)

  5. getTimeInMillis(); 밀리세컨드로 변환 - 날짜 차이 구할 때 사용
    • 차이값 / 24(시간)*60(분)*60(초)*1000(밀리세컨드)
    • 원하는 부분까지 나누면 된다.

 

1.2. 응용 method

  1. add();
    • 파라미터로 상수필드, 양수 혹은 음수 를 가진다.
    • 다른 필드에 영향을 미친다. -> 8월 31일 에서 날짜 +1 -> 9월 1일로 변경

  2. roll();
    • 파라미터로 상수필드, 양수 혹은 음수 를 가진다.
    • 다른 필드에 영향을 안미친다. -> 8월 31일 에서 날짜 +1 -> 8월 1일로 변경

 

  • 정리
Calendar calendar = Calendar.getInstance(); // 내부적으로 작동하여 구현 객체를 반환

calendar.clear(); // 전체 초기화 // 부분 초기화도 가능하다.
// calendar.clear(Calendar.SECOND);

calendar.set(1997,5,25);// 6월은 5를 넣어야한다.
calendar.set(Calendar.HOUR_OF_DAY, 20); // 시간,분,초는 이렇게 필드와 셋팅 시간으로 나타낼 수 있다.
calendar.set(Calendar.MINUTE, 20); // 시간,분,초는 이렇게 필드와 셋팅 시간으로 나타낼 수 있다.
calendar.set(Calendar.SECOND, 20); // 시간,분,초는 이렇게 필드와 셋팅 시간으로 나타낼 수 있다.

calendar.get(calendar.FIELD) // 아래 필드 다 사용 가능. 전부 숫자로 나옴
// YEAR, MONTH, WEEK_OF_YEAR, WEEK_OF_MONTH, DATE, DAY_OF_MONTH, DAY_OF_YEAR, DAY_OF_WEEK, DAY_OF_WEEK_IN_MONTH
// HOUR, HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND, ZONE_OFFSET, AM_PM
Calendar calendar = Calendar.getInstance(); // 내부적으로 작동하여 구현 객체를 반환
calendar.clear();
calendar.set(2020,2,22);
// get
calender.add(Calendar.MONTH, 10);
calender.roll(Calendar.MONTH, -10);

 

 

1.3. Calendar와 Date 변환

  • 이게 제일 중요
// calendar -> date
Calendar calender = Calendar.getInstance(); // 내부적으로 작동하여 구현 객체를 반환
Date date = new Date(calender.getTimeInMillis());

//date -> calendar
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

 

 

2. 형식화 클래스

  • 데이터를 정의된 패턴에 맞춰 형식화 할 수 있고 역으로 형식화된 데이터에서 원래의 데이터를 얻을 수 있다.

2.1. DecimalFormat

  • 숫자를 형식화 하는 클래스

  • 패턴
기호 의미 패턴 결과 format(12345567.89)
0 10진수(값이 없을 때 0 넣음) 0
0.0
0000000000.0000
1234568
1234567.9
0001234567.8900
# 10진수 #
#.#
##########.####
1234568
1234567.0
1234567.89
. 소수점 #.# 1234567.9
- 음수부호 #.#-
-#.#
1234567.9-
-1234567.9
, 단위 구분자 #,###.##
#,####.##
1,234,567.89
123,4567.89
% 퍼센트 #.#% 123456789%

 

  • 사용
double nuber = 1234567.89;
DecimalFormat df = new DecimalFormat("#,###.##");
df.formate(number);

 

  • 형식화된 문자열을 숫자로변경
    1. new DecimalFormat("패턴을 가진 숫자 string에 맞게 형식 패턴을 작성")   그래야지 동일한 패턴을 가진 String이 들어올때 정수로 올바르게 변환이 가능하다.
    2. DecimalFormat인스턴스.parse("1,234,567,89");   형식을 가진 string이 Number로 변환
    3. 변수명.doubleValue();     Number type을 기본형 타입으로 변환
// 핵심만 작성함
DecimalFormat decimalFormat = new DecimalFormat("###,###,###.#");
Number parse = decimalFormat.parse("123,123,123");
double d = parse.doubleValue();

 

2.2. SimpleDateFormat

  • 날짜 데이터를 원하는 형태로 출력하는 것
  • 패턴 
    1. 날짜
      • y :년도
      • M: 1~12월
      • d: 1~31일
    2. 시간
      • H: 0~23 시간
      • h: 1~12 시간
      • m: 0~ 59 분
      • s: 0~59 초
  • Date -> 원하는 형식의 날짜 시간형태로 표현하기
    • Calender는 사용 불가
    • 작동방식은 위와 동일하다
      1. SimpleDateFormat 객체 생성 및 내부에 원하는 형식 작성
      2. .format(new Date()); date를 형식에 맞게 변형하고 string으로 반환
      3. .parse(); 이용해서 원래 Date 객체 형태로 변형 가능 - SimpleDateFormat 내부 패턴이 parse의 argument에 들어가는 string의 형식과 동일해야함
Date date = new Date();

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String format = simpleDateFormat.format(date);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
Date date = simpleDateFormat.parse("2020/06/12");

 

2.3. ChoiceFormat

  • 특정 범위에 속하는 값을 문자열로 변환
  • 사용 방법
    1. 배열
    2. pattern
  • 배열 규칙
    1. limit: double type, 오름차순 작성
    2. grades: limit와 개수 동일
class ChoiceFormat {
    public static void main(String[] args) {
        double[] limits = {60, 70, 80, 90};
        String[] grades = {"D", "C", "B", "A"};
        
        int[] scores = {100, 95, 88, 79, 52, 60, 70};
        
        ChoiceFormat form = new ChoiceFormat(limits, grades);
        
        for(int i = 0; i < scores.length; i++) {
            form.format(scores[i]);
        }
    }
}

 

  • pattern 규칙
    • 패턴 구분자로 #, < 2가지 제공
      1. # : 경계값 포함
      2. < : 경계값 포함 안함
class ChoiceFormat {
    public static void main(String[] args) {
        String pattern = "60#D|70#C|80<B|90#A";
        int[] scores = {91, 90, 80, 88, 70, 52, 60};
        
        ChoiceFormat form = new ChoiceFormat(pattern);
        
        for(int i = 0; i < scores.length; i++) {
            form.format(scores[i]);
        }
    }
}

 

2.4. MessageFormat

  • 사용할 일이 그렇게 있을지는 모르겠는데 활용법은 또 다양
  • 자바의 정석 549p

 

3. java.time 패키지

  • 불변 클래스로 구성
  • 패키지 : time, time.chrono, time.format, time.temporal, time.zone