Java/Java의 정석

Chapter 10 날짜와 시간 & 형식화 date, time and formatting

계란💕 2022. 2. 28. 10:24

1.날짜와 시간

  1.1 Calendar 와 Date

  - Date -> Calendar(오래 쓰다가 바뀜) -> time

  - 실무에서는 아직 Calendar을 쓰기도 한다.

  - Calendar 클래스

    -> 추상 클래스(인스턴스 생성 불가)이므로 getInstance() - (static)를 통해 구현된 객체를 얻어야 한다.

  - Calendar 클래스

  - Date와 Calendar 간의 변환

    -> Date의 메서드는 대부분 'deprecated-더 이상 사용을 권장하지 않음.'되었지만 여전히 사용한다. "하위 호환성"

 

  - 컴퓨터는 항상 시간정수로 저장한다. 

  - clear(int field)는 Calendar 객체의 모든(특정) 필드를 초기화한다.

     -> 1970년 1월 1일 00:00:00 (EPOCH TIME)

  

  - add(): 특정 필드의 값을 증가 또는 감소 (다른 필드에 영향 O)

  - roll(): 특정 필드의 값을 증가 또는 감소 (다른 필드에 영향 X)

 

  Ex) Date와 Calendar 간의 변환

c++
열기

  Note) 실행 결과

  - getInstance() : 현재 날짜와 시간

  - set()메서드를 이용하면 원하는 날짜와 시간 정할 수 있다. 

  - get(Calendar.MONTH) : 0~11 => 1~12월을 의미한다.

 

  Ex) 두 날짜의 차이 구하기

c++
열기

  Note) 실행 결과

  - 두 날짜를 최소 단위인 초 단위로 바꾸고 그 차이를 구한다.

  - getTimeInMillis() : 1/1000초 단위로 값을 반환하기 때문에 

    -> '초' 단위로 얻으려면 1000으로 나눈다.

    -> '일' 단위로 얻으려면: 24 * 60 * 60 * 1000으로 나눈다.

 

  - add(int field, int amount) : 지정한 필드의 값을 원하는 만큼 증가/감소 시킬 수 있다.

  - roll(int field, int amount) : 지정한 필드의 값을 원하는 만큼 증가/감소 시킬 수 있다.(다른 필드의 값에 영향 X)

    -> 날짜 필드의 값을 31일 증가시키면 add는 월, 일이 함께 변하지만, roll은 일 필드의 값만 변한다.

 

  Ex)

java
열기

  Note) 실행 결과

  - 다음 달의 1일에서 하루를 빼면 이번 달의 마지막 일을 알 수 있다.

 

 

2. 형식화 클래스

  - java.text 패키지의 DecimalFormat, simpleDateFormat

  - 숫자와 날짜를 원하는 형식으로 쉽게 출력 가능(숫자, 날짜 -> 형식 문자열)

  - 형식 문자열에서 숫자와 날짜를 뽑아내는 기능(형식 문자열 -> 숫자, 날짜)

  - DecimalFormat: 숫자를 형식화할 때

  - Number 클래스: 숫자를 저장하는 래퍼 클래스의 조상

    -> Integer.parseInt()는 콤마가 포함된 문자열을 숫자로 변환하지 못한다.

 

  2.1 DecimalFormat

  - 숫자를 형식화 하는데 사용한다.

 

  2.2 SimpleDateFormat

  - 날짜와 시간을 다양한 형식으로 출력할 수 있게 해준다.

  - Date와 CalendarFormat만으로는 날짜 데이터를 원하는 형태로 다양하게 출력하기 복잡하다.

  Ex)

c++
열기

  Note) 실행결과

  - '(홑따옴표)는 escape기호이기 때문에 패턴 내에서 사용하기 위해서는 연속해서 두 번 사용한다. => ''

  - w(오늘은 올해의 몇 번째 주), W(오늘은 이 달의 몇 번째 주)

  - D(오늘은 올해의 D번째 날), d(오늘은 올해의 d번째 달)

  - F번째 E요일: (오늘은 이달의 F번째 E요일)

 

  Ex) 

  - Date인스턴스만 format메서드에 사용될 수 있으므로 Calendar인스턴스를 Date인스턴스로 변환해서 사용한다.

  - Date인스턴스를 Calendar로 변환할 때는 Calendar클래스의 setTimes()를 사용한다.

 

  Ex)

java
열기

  Note) 실행결과

 

                             

  2.3 ChoiceFormat

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

  - 연속적/불연속적인 값을 처리하는데 있어서 if/ switch문은 적절하지 않다.

 

  Ex)

c++
열기

  Note) 실행 결과

  - limits: 경계값, 경계값은 double형으로 반드시 오름차순으로 정렬 

  - grades는 치환할 문자열을 저장한다. 

  - limits와 grades는 개수가 같아야 예외가 발생하지 않는다.

  - ChoiceFormat 다른 형태: "limit#value"

    -> '#'은 경계값을 범위에 포함, '<'는 범위에 포함하지 않는다.

 

  2.4 MessageFormat

  •   MessageFormat는 데이터를 정해진 양식에 맞게 출력할 수 있도록 한다.
  •   SimpleDateFormat 의 parse처럼  MessageFormat의 parse를 이용하면 지정된 양식에서 필요한 데이터만 추출 가능.

 

  Ex) 

java
닫기
</hide>
String msg = "Name: {0} \nTel: {1} \nAge: {2} \nBirthday: {3}";
Object[] arguments = {"계란", "010-0000-2222", "20", "2003-01-01"};
String result = MessageFormat.format(msg, arguments);
System.out.println(result);
System.out.println(msg);

 

  Note) 실행 결과

  • 0~3  과 같이 arguments  배열 안에 인덱스 범위가 아닌 숫자를 입력할 경우, 중괄호와 숫자가 그대로 출력된다. 

 

3. java.time패키지

  3.1 java.time패키지의 핵심클래스

  - Calendar 클래스는 날짜와 시간을 하나로 표현 <-> time클래스는 별도의 클래스로 분리한다.

    -> 시간(LocalTime) ,날짜(LocalDate), 시간 & 날짜(LocalDateTime)

  - Calendar는 ZonedDateTime처럼 날짜, 시간, 시간대까지 모두 가지고 있다.

 

  - Period와 Duration

    -> Period: 두 날짜간의 차이

    -> Duration: 시간의 차이 

 

  - now(): 현재 날짜와 시간을 저장하는 객체 생성 

  - of(): 해당 필드의 값을 순서대로 지정해주면 된다. 

 

  3.2 LocalDate() 와 LocalTime()

  - time패키지의 가장 기본이다.

  - now(), of() 모두 static 메서드

  - 특정 필드의 값 가져오기 - get() , getXXX()

  - 날짜와 시간에서 필드의 값 변경하기 - with(), plus(), minus()

    -> with() : 원하는 필드를 직접 지정 가능

  - 날짜와 시간의 비교 - isAfter(), isBefore(), isEqual()

    -> date1.compareTo(date2) : 같으면 0, date1이 이전이면 -1, date1이 이후이면 1

 

  Ex) chronrlogy(연표)

c++
열기

  Note) 실행결과

 

  3.3 Instant

  - instant는 에포크 타임(1970-01-01-00:00:00 UTC) 부터 경과된 시간을 나노초 단위로 표현한다. 

  - Instant를 생성할 때는 now() 와 ofEpochSecond()를 사용한다.

  

  3.4 LocalDateTime과 ZonedDateTime

  - ZoneOffset

    -> UTC로부터 얼마만큼 떨어져있는지를 표현한다.

    -> 서울은 +9이다. UTC보다 (32400초 = 60 * 60 * 9 ) 9시간이 빠르다.

 

  Ex)

java
열기

  Note) 실행결과

 

  3.5 Temporaladjusters 클래스

  - 자주 쓰일만한 날짜 계산들을 대신 해주는 메서드 정의되어있다.

  Ex)

c++
열기

  Note) 실행결과

  - adjustInto()는 내부적으로만 사용할 의도로 작성되었다. ->( with 사용)

 

  3.6 Period와 Duration

  - between() : 두 날짜의 차이를 타나타내는 Period를 얻을 수 있다. (static 메서드) 

  - until(): between()과 거의 같으나 인스턴스 메서드

  - 시간 차이를 이요할 때는 "Duration"

  - 특정 필드의 값을 얻을 때는 get()을 이용한다.

  - of(), with()

  - normalized() : 월의 값이 12을 넘지 않게, 1년 13개월 -> 2년 1개월로 바꿔 준다. (일의 길이는 그대로)

 

  Ex)

c++
열기

  Note) 실행결과

 

  3.7 파싱(parsing)과 포맷

  - 파싱: 날짜와 시간을 원하는 형식으로 출력하고 해석

  - 로케일에 종속된 포맷터를 생성: ofLocalizedDate(), ofLocalizedTime(), odLocalized DateTime()

  Ex)

c++
열기

  Note) 실행결과

  - MMM: 2월

  - SSS: 천분의 일초

  - Z: zone-offset , +0900

  - VV: 시간대(ID) , Asia/Seoul

 

  - 문자열을 날짜와 시간으로 파싱하기

    -> parse()는 오버로딩된 메서드가 여러 개 있다.

    ->  다음의 두 가지가 자주 쓰인다.

c++
닫기
static LocalDateTime parse(CharSequence text)
static LocalDateTime parse(CharSequence text, DateTimeFormatter formatter)

  - 자주 사용되는 기본적인 문자열은 형식화 상수를 사용하지 않고도 파싱이 가능하다.

  Ex)

c++
열기

  Note) 실행 결과

  - ofPattern()을 이용해서 파싱한다.