[기본 개념] 5 | (3.2) Instant, LocalDateTime, ZonedDateTime, TemporalAdjusters

728x90

[기본 개념] 5 | (3.2) Instant, LocalDateTime, ZonedDateTime, TemporalAdjusters

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

2 LocalDate와 LocalTime

3> Instant

4> LocalDateTime과 ZonedDateTime

5> TemporalAdjusters

6 Period와 Duration

7 파싱과 포맷

3. Instant

 Instant는 에포크 타임(EPOCH TIME)부터 경과한 시간을 나노초 단위로 표현한다. 사람이 사용하는 날짜와 시간은 여러 진법이 섞여있어서 계산하기 어렵지만 단일 진법으로 다루기 때문에 계산이 쉽다.

 

 Instant를 생성할 때는 now( )ofEpochSecond( )를 사용한다. 그리고 필드에 저장된 값을 가져올 때는 다음과 같이 한다.

 

long epochSec = now.getEpochSecond( ) ;

int nano = now.getNano( ) ;

 

Instant는 항상 UTC(+00:00)을 기준으로 하기 때문에, LocalTime과는 차이가 있을 수 있다.

 

Instant와 Date간의 변환

Date에 Instant로 변환할 수 있는 메서드가 있다.

 

static Date from(Instant instant)            // Instant --> Date

Instant toInstant( )                                        // Date --> Instant

4. LocalDateTime과 ZonedDateTime

LocalDate와 LocalTime으로 LocalDateTime만들기

LocalDate와 LocalTime을 합쳐서 하나의 LocalDateTime을 만들 수 있다.

 

LocalDate date = LocalDate.of(2015, 12, 31) ;

LocalTime time = LocalTime.of(12, 34, 56) ;

 

LocalDateTime dt = LocalDateTime.of(date, time) ;

 

LocalDateTime에도 날짜와 시간을 직접 지정할 수 있는 of( )now( )도 정의되어 있다.

 

LocalDateTime의 변환

반대로 LocalDate또는 LocalTime으로 변환할 수 있다.

 

LocalDateTime dt = LocalDateTime.of(2015, 12, 31, 12, 34, 56) ;

LocalDate date = dt.toLocalDate ;     // LocalDateTime --> LocalDate

LocalTime time = dt.toLocalTime ;     // LocalDateTime <-- LocalTime

 

LocalDateTime으로 ZonedDateTime만들기

 LocalDateTime에 시간대(time-zone)을 추가하면, ZonedDateTime이 된다. 새로운 시간 패키지에서는 ZoneId라는 클래스를 사용한다. ZoneId는 일광 절약시간(DST)을 자동적으로 처리해준다.

 

LocalDateTime에 atZone( )으로 시간대 정보를 추가하면, ZonedDateTime을 얻을 수 있다.

 

ZoneId zid = ZoneId.of("Asia/Seoul") ;

ZonedDateTime zdt = dateTime.atZone(zid) ;

System.out.println(zdt) ;       // 2015-11-27T17:47:50.451+09:00[Asia/Seoul]

 

ZoneOffset

UTC로부터 얼마큼 떨어져 있는지 ZoneOffset으로 표현한다. 예를 들어 서울은 '+9', 즉 9시간이 더 빠르다.

 

OffsetDateTime

 ZonedDateTime에서 일광절약시간처럼 계절별로 더했다 뺐다 하는 ZoneId가 아닌 단지 시간대를 시간의 차이로 구분하는 ZoneOffset을 사용하는 것이 OffsetDateTime이다.

 

 OffsetDateTime은 ZonedDateTime에 toOffsetDateTime( )을 호출해서 얻을 수 있고, LocalDate와 LocalTime에 ZoneOffset을 더해서 얻을 수도 있다.

 

ZonedDateTime의 변환

 ZonedDateTime도 날짜와 시간에 관련된 다른 클래스로 변환하는 메서드들을 가지고 있다. ZonedDateTime가 GregorianCalendar와 가장 유사한데 서로 변환 방법만 알면 다른 날짜와 시간 클래스들로 변환할 수 있다.

 

// ZonedDateTime --> GregorianCalendar

GregorianCalendar from(ZonedDateTime zdt)

 

// GregorianCalendar --> ZonedDateTime

ZonedDateTime toZonedDateTime( )

5. TemporalAdjusters

자주 쓰일만한 날짜 계산들을 대신해주는 메서드를 정의해 놓은 것이 TemporalAdjsters클래스이다.

 

메서드 설명
firstDayOfNextYear( ) 다음 해의 첫 날
firstDayOfNextMonth( ) 다음 달의 첫 날
firstDayOfYear( ) 올 해의 첫 날
firstDayOfYear( ) 이번 달의 첫 날
lastDayOfYear( ) 올해의 마지막 날
lastDayOfMonth( ) 이번 달의 마지막 날
firstInMonth(DayOfWeek dayOfWeek) 이번 달의 첫 번째 ?요일
lastInMonth(DayOfWeek dayOfWeek) 이번 달의 마지막 ?요일
previous(DayOfWeek dayOfWeek) 지난 ?요일(당일 미포함)
previousOrSame(DayOfWeek dayOfWeek) 지난 ?요일(당일 포함)
next(DayOfWeek dayOfWeek) 다음 ?요일(당일 미포함)
nextOrSame(DayOfWeek dayOfWeek) 다음 ?요일(당일 포함)
dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek) 이번 달의 n번째 ?요일

 

TemporalAdjuster 직접 구현하기

필요하면 TemporalAdjuster인터페이스를 구현한 클래스의 객체를 매개변수로 제공하여 만들 수 있다.

 

@FunctionalInterface

public interface TemporalAdjuster {

    Temporal adjustInto(Temporal temporal) ;

}

 

 이 메서드에서 실제 구현해야 하는 것은 adjustInto( )지만 내부적으로만 사용할 의도로 작성된 것이기 때문에 우리가 TemporalAdjuster와 같이 사용할 메서드인 with( )를 사용하는 것이 좋다.

 

 

 

 

 

출처 | Java의 정석 (남궁 성)

728x90