자바/java.time 패키지

java.time 패키지(1)

백_곰 2022. 1. 6. 14:10

1. java.time 패키지

- 앞서 말했듯이 Date와 Calendar가 가지고 있는 단점을 해소하기 위해 나오게 되었다.

 

- java.time 패키지는 String처럼 불변이기 때문에, 날짜와 시간을 변경하는 메서드 내부에서는

새로운 객체를 생성한다.

 

- Calendar 클래스는 날짜와 시간을 하나로 표현하는 반면 이 패키지에서는 시간을 표현할 때는

LocalTime을 날짜를 표현할 때는 LocalDate를 표현한다. 

 

- 또한 날짜와 시간을 둘 다 필요하다면 LocalDateTime을 사용하고, 시간대(time-zone)까지 사용한다면

ZonedDateTime까지 사용해야 한다.

 

- Date 클래스와 유사한 클래스로는 Instant가 있는데, 초 단위로 표현한다.

 

- 또한 날짜와 시간을 초단위로 표현하는 값을 타임스탬프라고 부른다.

 

- Period 클래스는 두 날짜간의 차이를 표현하고, Duration 클래스 시간의 차이를 표현하는 것이다.

 

 

 

- 객체 생성은 다음과 같다.

(1) LocalDate ld = LocalDate.now() 

(2) LocalDate ld = LocalDate.of(2022.01.06)

( LocalTime과  LocalDateTime, ZonedDateTime 또한 위와 동일하다. )

 

 

 

 

1-1. Temporal & TemporalAmount

- Temporal, TemporalAccessor, TemporalAdjuster 인터페이스를 구현한 클래스는 다음과 같다.

( LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Instant 등)

 

- TemporalAmount 인터페이스를 구현한 클래스는 다음과 같다.

( Period, Duration )

 

 

 

 

1-2. TemporalUnit & TemporalField

- 날짜와 시간 단위를 정의해 놓은 것이 TemporalUnit 인터페이스고 이것을 구현한 것이 열거형 ChronoUnit이다.

 

- 년, 월, 일 등 날짜와 시간의 필드를 정의해 놓은 것이 TemporalField 인터페이스고 이것을 구현한 것이 열거형

ChronoField이다.

 

- 이때 열거형의 뜻은 서로 관련된 상수를 묶어서 정의해 놓은 것을 말한다.

 

 

- 아래의 코드들을 보고 이해하자.

 

( 이렇게 보면 언제 ChronoFieldChronoUnit을 써야할 지 헷갈릴 수 있는데, 이것을 지원하는 메서드가 있다. )

( boolean isSupported(TemporalUnit unit) or (ChronoField field) 가 있다. )

 

 

 

 

1-3. LocalDate & LocalTime

- 아래의 코드처럼 일 단위나 초 단위로도 생성자 초기화가 가능하다.

 

- 또한 아래의 코드처럼 parse() 함수를 이용해서도 생성자 초기화가 가능하다.

 

- Calendar 클래스와는 다르게 1~12월은 숫자 그대로 index 값을 사용하며, 요일은 1이 월요일부터 시작이다.

 

- 자세한 메서드는 자바의 정석 556p를 참고하자.

 

 

 

- 필드 값 변경하는 메서드는 다음과 같다.

(1) LocalDate with(TemporalField field, long newValue) - withYear, withMonth,

withDayOfMonth(int dayOfMonth)

: 값을 직접 저장할 수 있다.

: 주의할 점은 객체를 생성해서 다시 반환하기 때문에 대입 연사자가 없으면 안된다.

 

 

(2) LocalTime plus() or minus()

: with의 메서드와 유사하며, 더하거나 빼준다.

: 날짜와 시간의 비교 또한 가능한데, compareTo를 사용하면 된다.

: isAfter()와 isBefore(), isEqual()도 존재하는데, equals()가 존재하는데도 isEqual()이 있는 이유는 날짜만을

비교하기 위해 정의되었다.

( 예를 들어, 일본 날짜와 우리나라 날짜를 비교한다고 했을 떄, equals()는 false가 isEqual()은 true가 반환된다. )

 

 

 

 

1-4. LocalDateTime & ZonedDateTime

- LocaltDateTime을 생성하는 방법은 아래의 코드를 보고 이해하자.

 

 

 

- LocalDateTime에 시간대(time-zone)을 추가하면, ZonedDateTime이 되며, 여기서는 ZoneId라는

클래스를 사용한다.

 

 

 

- 만약 뉴욕이나 외국에 있는 시간을 불러오고 싶다면 아래의 코드처럼 하면 된다.

 

 

 

 

1-5. OffsetDateTime

- 1-4에서 했던 ZonedDateTime은 ZoneId를 사용하는데 일광절약시간처럼 시간대와 관련된 규칙이 포함되어 있다.

그러나 OffsetDateTime은 그것 대신에 ZoneOffset을 사용한다.

 

- 서로 다른 시간대에 존재하는 컴퓨터간의 통신에는 OffsetDateTime을 사용한다.

 

 

 

- 아래의 코드를 보고 이해하자.

( ZoneOffset은 UTC로부터 얼마만큼 떨어져 있는지를 표현한다. )