java.time 패키지(1)
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이다.
- 이때 열거형의 뜻은 서로 관련된 상수를 묶어서 정의해 놓은 것을 말한다.
- 아래의 코드들을 보고 이해하자.
( 이렇게 보면 언제 ChronoField나 ChronoUnit을 써야할 지 헷갈릴 수 있는데, 이것을 지원하는 메서드가 있다. )
( 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로부터 얼마만큼 떨어져 있는지를 표현한다. )