[기본 개념] 5 | (3.1) java.time 패키지, LocalDate, LocalTime

728x90

[기본 개념] 5 | (3.1) java.time 패키지, LocalDate, LocalTime

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

2> LocalDate와 LocalTime

3 Instant

4 LocalDateTime과 ZonedDateTime

5 TemporalAdjusters

6 Period와 Duration

7 파싱과 포맷

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

 java.time패키지에서는 날짜와 시간을 별도의 클래스로 분리해놓았다. 시간을 표현할 때는 LocalTime클래스를 사용하고, 날짜를 표현할 때는 LocalDate클래스를 사용한다. 날짜와 시간이 필요하면 LocalDateTime클래스를 사용한다. 여기에 시간대(time-zone)가지 다뤄야 하면 ZonedDateTime클래스를 사용한다.

 

Period와 Duration

Period는 두 날짜간의 차이를 표현하기 위한 것이고, Duration은 시간의 차이를 표현하기 위한 것이다.

 

객체 생성하기 - now( ), of( )

java.time패키기에 속한 클래스의 객체를 생성하는 기본적은 방법은 now( )와 of( )를 사용하는 것이다.

 

now( )는 현재 날짜와 시간을 저장하는 객체를 생성한다.

 

LocalDate date = LocalDate.now( ) ;                                                  // 2015-11-23

LocalTime time = LocalTime.now( ) ;                                                // 21:54:01.875

LocalDateTime dateTime = LocalDateTime.now( ) ;                 // 2015-11-23T21:54:01.875

ZonedDateTime dateTimeInKr = ZonedDateTime.now( ) ;   // 2015-11-23T21:54:01.875+09:00[Asia/Seoul]

 

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

 

LocalDate date = LocalDate.of(2015, 11, 23) ;               // 2015년 11월 23일

LocalTime time = LocalTime.of(23, 59, 59) ;                  // 23시 59분 59초

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

ZonedDateTime zDateTime = ZonedDateTime.of(dateTime, ZoneId.of("Asia/Seoul")) ;

 

Temporal과 TemporalAmount

 날짜와 시간을 표현하기 위한 클래스들은 모두 Temporal, TemporalAccessor, TemporalAdjuster인터페이스를 구현했고, Duration과 Period는 TemporalAmount인터페이스를 구현했다.

 

TemporalUnit과 TemporalField

 날짜와 시간의 단위를 정의해 놓은 것이 TemporalUnit인터페이스이고, 이 인터페이스를 구현한 것이 열거형 ChronoUnit이다. 그리고 TemporalField는 날짜와 시간의 필드를 정의해 놓은 것으로, 열거형 ChronoField가 이 인터페이스를 구현하였다.

 

 날짜와 시간에서 특정 필드의 값만을 얻을 때는 get( )이나 get으로 시작하는 이름의 메서드를 이용한다. 그리고 특정 날짜와 시간에서 지정된 단위의 값을 더하거나 뺄 때는 plus( )또는 minus( )에 값과 열거형 ChronoUnit을 사용한다.

 

LocalDate today = LocalDate.now( ) ;   // 오늘

LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS) ;  // 오늘에 1일을 더한다.

LocalDate tomorrow = today.plusDays(1) ; // 위의 문장과 같다.

2. LocalDate와 LocalTime

 객체를 생성하는 방법은 현재의 날짜와 시간을 LocalDate와 LocalTime으로 각각 반환하는 now( )지정된 날짜와 시간으로 객체를 생성하는 of( )가 있다.

 

LocalDate today = LocalDate.now( ) ;     // 오늘의 날짜

LocalTime now = LocalTime.now( ) ;       // 현재 시간

LocalDate birthDate = LocalDate.of(1999, 12, 31) ;   // 1999년 12월 31일

 

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

 특정 필드의 값을 가져올 때, 아래의 표에 있는 메서드를 사용하며 Calendar와 달리 월(month)의 범위가

1 ~ 12이고, 요일은 월요일이 1이다.

 

클래스 메서드 설명 (1999-12-31 23:59:59)
LocalDate int getYear( ) 년도(1999)
LocalDate int getMonthValue( ) 월(12)
LocalDate Month getMonth( ) 월(DECMBER) getMonth( ).getValue( ) = 12
LocalDate int getDayOfMonth( ) 일(31)
LocalDate int getDayOfYear( ) 같은 해의 1월 1일부터 몇 번째 일(365)
LocalDate DayOfWeek getDayOfWeek( ) 요일(Friday) getDayOfWeek( ).getValue( ) = 5
LocalDate int lengthOfMonth( ) 같은 달의 총 일수(31)
LocalDate int lengthOfYear( ) 같은 해의 총 일수(365), 윤년이면 366
LocalDate boolean isLeapYear( ) 윤년 여부 확인(false)
------------ ---------------------------------     ------------------------------------------------------------------------------
LocalTime int getHour( ) 시(23)
LocalTime int getMinute( ) 분(59)
LocalTime int Second( ) 초(59)
LocalTime int getNano( ) 나노초(0)

 

필드의 값 변경하기 - with( ), plus( ), minus( )

 날짜와 시간에서 특정 필드 값을 변경하려면, with로 시작하는 메서드로 사용하면 된다. with( )를 사용하면, 원하는 필드를 직접 설정할 수 있다.

 

date = date.withYear(2000) ;    // 년도를 2000년으로 변경

time = time.withHour(12) ;        // 시간을 12시로 변경

 

 특정 필드에 값을 더하거나 빼는 plus( )와 minus( )도 있다. 그리고 LocalTime의 truncatedTo( )는 지정된 것보다 작은 단위의 필드를 0으로 만든다. truncatedTo( )메서드는 LocalTime에만 있다.

 

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

비교기 편한 메서드들이 있다.

 

boolean isAfter (ChronoLocalDate other)

boolean isBefore(ChronoLocalDate other)

boolean isEqual(ChronoLocalDate other)      // LocalDate에만 있음

 

isEqual( )은 오직 날짜만 비교하므로 모든 필드가 일치해야 하는 equals( )랑은 다르다.

 

예제/NewTimeEx1.java

import java.time.*;
import java.time.temporal.*;

public class NewTimeEx1 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();  // 오늘의 날짜
        LocalTime now = LocalTime.now();    // 현재 시간

        LocalDate birthDate = LocalDate.of(1999, 12, 31);
        LocalTime birthTime = LocalTime.of(23, 59, 59);
        System.out.println("today = " + today);
        System.out.println("now = " + now);
        System.out.println("birthDate = " + birthDate);
        System.out.println("birthTime = " + birthTime);

        System.out.println(birthDate.withYear(2000));
        System.out.println(birthDate.plusDays(1));
        System.out.println(birthDate.plus(1, ChronoUnit.DAYS));

        System.out.println(birthTime.truncatedTo(ChronoUnit.HOURS));

        System.out.println(ChronoField.CLOCK_HOUR_OF_DAY.range());
        System.out.println(ChronoField.HOUR_OF_DAY.range());
    }
}
실행결과

today = 2021-12-01
now = 18:09:34.888
birthDate = 1999-12-31
birthTime = 23:59:59
2000-12-31
2000-01-01
2000-01-01
23:00
1 - 24
0 - 23

 

 

 

 

 

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

 
728x90