본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/9. 기본 API 클래스

16. Java 자바 [API] - java.time 패키지

 

 

자바 8 부터 추가된 날짜와 시간을 조작하는 여러 가지 추가된 API

 

패키지

설명

java.time

날짜와 시간을 나타내는 핵심 API 클래스를 포함

이 클래스들은 ISO-8601에 정의된 달력 시스템에 기초한다.

java.time.chrono

ISO-8601 에 정의된 달력 시스템 이외의 달력 시스템이 필요 시 사용하는 API

java.time.format

날짜와 시간을 파싱하고 포맷팅 하는 API

java.time.temporal

날짜와 시간을 연산하기 위한 보조 API

java.time.zone

타임존을 지원하는 API

 

java.time 패키지에는 아래와 같이 날짜와 시간을 표현하는 5개의 클래스가 있다.

 

- LocalDate : 로컬 날짜 클래스

- LocalTime : 로컬 시간 클래스

- LocalDateTime : 로컬 날짜 및 시간 클래스 (LocalDate + LocalTime)

- ZonedDateTime : 특정 타임존(TimeZone)의 날짜와 시간 클래스

- Instant : 특정 시점의 Time-Stamp 클래스

 

 

1. LocalDate

 

날짜 정보만 저장할 수 있다. LocalDate 객체는 두 가지 정적 메소드를 얻을 수 있다.

now() 메소드는 컴퓨터의 현재 날짜 정보를 저장한 LocalDate 객체를 리턴한다.

of() 메소드는 매개값으로 주어진 날짜 정보를 저장한 LocalDate 객체를 리턴한다.

 

LocalDate currDate = LocalDate.now();

LocalDate targetDate = LocalDate.of(int year, int month, int datOfMonth);

 

2. LocalTime

 

시간 정보만 저장할 수 있다. LocalTime 객체도 두 가지 정적 메소드를 얻을 수 있다.

now() : 컴퓨터의 현재 시간 정보를 저장한 LocalTime 객체를 리턴한다.

of() : 매개값으로 주어진 시간 정보를 저장한 LocalTime 객체를 리턴한다.

 

LocalTime currTime = LocalTime.now();

LocalTime targetTime = LocalTime.of(int hour, int minute, int second, int nanoOfSecond);

 

3. LocalDateTime

 

LocalDate + LocalTime 클래스로 날짜와 시간 정보를 모두 저장할 수 있다.

now() : 컴퓨터의 현재 날짜와 시간 정보를 저장한 LocalDateTime 객체를 리턴한다.

of() : 매개값으로 주어진 날짜와 시간 정보를 저장한 LocalDateTime 객체를 리턴한다.

 

 

LocalDateTime currDateTime = LocalDateTime.now();

LocalDateTime targetTime = LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond);

 

4. ZonedDateTime

 

달력 시스템의 타임존의 날짜와 시간을 저장하는 클래스

저장 형태 : 2014-04-21T07:50:24.017+09:00[Asia/Seoul] 맨 뒤에 타임존 정보가 붙는다.

 

now() : ZoneId 를 매개값을 주어 ZonedDateTime 객체를 리턴한다.

 

of() : 매개값은 java.util.TimeZone 의 getAvailableIDs() 메소드가 리턴하는 유효한 값중 하나를 넣어서

         ZoneId 를 얻을 수 있다.

 

ZonedDateTime utcDateTime = ZonedDateTime.now(ZoneId.of(“UTC”));

ZonedDateTime londonDateTime = ZonedDateTime.now(ZoneId.of(“Europe/London”));

ZonedDateTime seoulDateTime = zonedDateTime.now(ZoneId.of(“Asia/Seoul”));

 

5. Instant

 

날짜, 시간 정보를 얻거나 조작하는데 사용하지 않고,

특정 시점의 타임스탬프로 사용된다. 주로 특정한 두 시점 간의 시간적 우선순위를 따질 때 사용한다.

 

java.util.Date 와 가장 유사한 클래스이지만, 차이점은 Date 는 로컬 컴퓨터의 현재 날짜와 시간 정보를 기준으로 하지만, Instant 는 협정세계시(UTC)를 기준으로 한다.

 

Instant instant1 = Instant.now();

Instant instant2 = Instant.now();

if(instant1.isBefore(instant2)) { System.out.println(“instant1이 빠릅니다.”); }

else if(instant1.isAfter(instant2)) { System.out.println(“instant1이 늦습니다.”); }

else { System.out.println(“동일한 시간입니다.”); }

System.out.println(“차이(nanos) : ” + instant1.until(instant2, ChronoUnit.NANOS));

 

isBefore(), isAfter() 는 시간 앞뒤 여부를 확인하는 메소드이다.

 

util() 메소드는 두 시점 간의 차이를 리턴한다.

 


1. 날짜와 시간에 대한 정보 얻기

 

LocalDate 와 LocalTime은 프로그램에서 날짜와 시간 정보를 이용할 수 있도록 아래와 같은 메소드를 제공한다.

 

클래스

리턴 타입

메소드(매개 변수)

설명

LocalDate

int

getYear()

Month

getMonth()

Month 열거값

int

getMonthValue()

int

getDayOfYear()

일년의 몇 번째 일

int

getDayOfMonth()

월의 몇 번째 일

DayOfWeek

getDayOfWeek()

요일

boolean

isLeapYear()

윤년 여부

LocalTime

int

getHour()

시간

int

getMinute()

int

getSecond()

int

getNano()

나노초 리턴

 

 

LocalDateTime, ZonedDateTime은 날짜와 시간 정보를 모두 가지고 있기 때문에

위 표의 대부분의 메소드를 가지고 있다.

 

단, isLeapYear() LocalDate에만 있기 때문에 toLocalDate() 메소드로 LocalDate 변환한 후에 사용할 수 있다.

 

 

ZonedDateTime은 시간존에 대한 정보를 제공하는 아래 메소드를 추가로 가지고 있다.

 

클래스

리턴 타입

메소드(매개 변수)

설명

ZonedDateTime

ZoneId

getZone()

존아이디 리턴(Asia/Seoul)

ZoneOffset

getOffset()

존 오프셋(시차) 리턴

 


2. 날짜와 시간 조작하기

 

날짜와 시간 클래스들은 날짜와 시간을 조작하는 메소드와 상대 날짜를 리턴하는 메소드들을 가지고 있다.

 

 

 

- 날짜와 시간 빼거나 더하기

 

클래스

리턴 타입

메소드(매개 변수)

설명

LocalDate


LocalDateTime


ZonedDateTime

LocalDate


LocalDateTime


ZonedDateTime

minusYear(long)

년 빼기

minusMonths(long)

달 빼기

minusDays(long)

일 빼기

minusWeeks(long)

주 빼기

plusYears(long)

년 더하기

plusMonths(long)

달 더하기

plusWeeks(long)

주 더하기

plusDays(long)

일 더하기

minusHours(long)

시간 빼기

minusMinutes(long)

분 빼기

 

minusSeconds(long)

초 빼기

 

minusNanos(long)

나노초 빼기

 

plusHours(long)

시간 더하기

 

plusMinutes(long)

분 더하기

plusSeconds(long)

초 더하기

plusNanos(long)

나노초 더하기

 

각 메소드들은 수정된 LocalDate, LocalTime, LocalDateTime, ZonedDateTime 을 리턴하기 때문에

(.) 도트 연산자로 연결해서 순차적으로 호출할 수 있다.

 

예) LocalDateTime targetDateTime = now.PlusYear(1).minusMonths(2). ...

 

 

- 날짜와 시간 변경하기

 

클래스

리턴 타입

매소드(매개 변수)

설명

LocalDate


LocalDateTime


ZonedDateTime

LocalDate


LocalDateTime


ZonedDateTime

withYear(int)

년 변경

withMonth(int)

월 변경

withDatOfMonth(int)

월의 일 변경

withDayOfYear(int)

년의 일 변경

with(TemporalAdjust adjuster)

상대 변경

withHour(int)

 

시간 변경

withMinute(int)

 

분 변경

withSecond(int)

 

초 변경

withNano(int)

나노초 변경

 

with() 메소드는 상대 변경 : 현재 날짜를 기준으로 해의 첫 번째 일 또는 마지막 일, 달의 첫 번째 일 또는 마지막일, 달의 첫 번째 요일, 지난 요일 및 돌아오는 요일 등.. 상대적인 날짜를 리턴한다.

 

매개값은 TemporalAdjuster 타입으로 다음 표에 있는 TemporalAdjusters 정적 메소드를 호출하면 얻을 수 있다.

 

리턴 타입

메소드(매개 변수)

설명

TemporalAdjuster

firstDayOfYear()

이번 해의 첫 번째 일

lastDayOfYear()

이번 해의 마지막 일

firstDayOfNextYear()

다음 해의 첫 번째 일

firstDayOfMonth()

이번 달의 첫 번째 일

lastDayOfMonth()

이번 달의 마지막 일

firstDayOfNextMonth()

다음 달의 첫 번째 일

firstInMonth(DayOfWeek dayOfWeek)

이번 달의 첫 번째 요일

lastInMonth(DayOfWeek dayOfWeek)

이번 달의 마지막 요일

next(DayOfWeek dayOfWeek)

돌아오는 요일

nextOrSame(DayOfWeek dayOfWeek)

돌아오는 요일(오늘 포함)

previous(DayOfWeek dayOfWeek)

지난 요일

previousOrSame(DayOfWeek dayOfWeek)

지난 요일(오늘 포함)

 

 


3. 날짜와 시간 비교하기

 

클래스

리턴 타입

메소드(매개 변수)

설명

LocalDate

LocalDateTime

boolean

isAfter(ChronoLocalDate other)

이후 날짜인지 비교

isBefore(ChronoLocalDate other)

이전 날짜인지 비교

isEqual(ChronoLocalDate other)

동일 날짜인지 비교

LocalTime

LocalDateTime

boolean

isAfter(LocalTime other)

이후 시간인지 비교

isBefore(LocalTime other)

이전 시간인지 비교

LocalDate

Period

until(ChronoLocalDate endDateExclusive)

날짜 차이

LocalDate

LocalTime

LocalDateTime

long

 

until(

    Temporal endExclusive,

    TemporalUnit unit

)

시간 차이

Period

Period

between(

    LocalDate startDateInclusive,

    LocalDate endDateExclusive

)

날짜 차이

Duration

 

Duration

 

between(

    LocalDate startDateInclusive,

    LocalDate endDateExclusive

)

시간 차이

ChronoUnit.YEARS

long

between(

    Temporal temporal1Inclusive,

    Temporal temporal2Exclusive

)

전체 년 차이

ChronoUnit.MONTHS

전체 달 차이

ChronoUnit.WEEKS

전체 주 차이

ChronoUnit.DAYS

전체 일 차이

ChronoUnit.HOURS

전체 시간 차이

ChronoUnit.SECONDS

전체 초 차이

ChronoUnit.MILLIS

전체 밀리초 차이

 

ChronoUnit.NANOS

전체 나노초 차이

 

Period, Duration 은 날짜와 시간의 양을 나타내는 클래스이다.

Period는 년, 달, 일의 양을 나타내고, Duration은 시, 분, 초, 나노초의 양을 나타낸다.

(D-day, D-time 을 구할 때 사용된다.)

 

 

- Period, Duration에서 제공하는 메소드들

 

클래스

리턴 타입

메소드(매개 변수)

설명

Period

int

getYears()

년의 차이

getMonths()

달의 차이

getDays()

일의 차이

Duration

int

getSeconds()

초의 차이

getNano()

나노초의 차이

 

- between() 메소드

 

Period, Duration 의 between() 은 년, 달, 일, 초의 단순 차이를 리턴하고,

ChronoUnit 열거 타입의 between()은 전체 시간을 기준으로 차이를 리턴한다.

 

예) 2023년 1월 – 2024년 3월

Period, Duration 의 between() : 2

ChronoUnit.MONTHS.between() : 14

 


4. 파싱과 포맷팅

 

파싱 (parsing) : 문자열에서 날짜와 시간을 생성하는 메소드

포맷팅 (formatting) : 날짜와 시간을 문자열로 변환하는 메소드

 

- 파싱 메소드

 

날짜와 시간 정보가 포함된 문자열을 파싱해서 날짜와 시간을 생성하는 두 개의 parse() 정적 메소드

 

클래스

리턴 타입

메소드(매개 변수)

설명

LocalDate

LocalTime

LocalDateTime

ZonedDateTime

LocalDate

LocalTime

LocalDateTime

ZonedDateTime

parse(CharSequence)

ISO_LOCAL_DATE
포멧터를 사용

(“2024-03-07”)

parse(CharSequence, DateTimeFormatter)

다른 포멧터를 사용할 경우

ofPattern() 메소드로 정의

 

LocalDate localDate = LocalDate.parse(“2024-05-21”);

 

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(“yyyy.MM.dd”);

LocalDate localDate = LocalDate.parse(“2024.05.21”, formatter);

 

DateTimeFormatter에는 표준화 된 포맷터들이 아래 상수로 미리 정의되어 있다.

ofPattern() 메소드를 사용하지 않고 바로 사용할 수 있다.

 

상수

설명

BASIC_ISO_DATE

Basic ISO date

“20111203”

ISO_LOCAL_DATE

ISO Local Date

“2011-12-03”

ISO_OFFSET_DATE

ISO Date with offset

“2011-12-03+01:00”

ISO_DATE

ISO Date with or without offset

“2011-12-03_01:00”; “2011-12-03”

ISO_LOCAL_TIME

Time without offset

“10:15:30”

ISO_OFFSET_TIME

Time with offset

“10:15:30+01:00”

ISO_TIME

Time with or without offset

“10:15:30+01:00”; “10:15:30”

ISO_LOCAL_DATE_TIME

ISO Local Date and Time

“2011-12-03T10:15:30”

ISO_OFFSET_DATE_TIME

Date Time with Offset

“2011-12-03T10:10:15:30+01:00”

ISO_ZONED_DATE_TIME

Zoned Date Time

“2011-12-03T10:15:30+01:00[Europe/Paris]”

ISO_DATE_TIME

Date and time with ZoneID

“2011-12-03T10:15:30+01:00[Europe/Paris]”

ISO_ORDINAL_DATE

Year and day of year

“2012-337”

ISO_WEEK_DATE

Year and Week

“2012-W48-6”

ISO_INSTANT

Date and Time of an Instant

“2011-12-03T10:15:30Z”

RFC_1123_DATE_TIME

RFC 1123 / RFC 822

“Tue, 3 Jun 2008 11:05:30 GMT

 

예를 들어 parse(CharSequence) 와 동일하게 “2024-05-21” 이라는 문자열을 파싱해서 localDate 객체를

얻으려면 아래코드를 사용한다.

 

LocalDate localDate = LocalDate.parse(“2024-05-21”, DateTimeFormatter.ISO_LOCAL_DATE);

 

만약 포멧터의 형식과 다른 문자열을 파싱하게 된다면 DateTimeParseException 예외가 발생한다.

 

 

- 포맷팅 메소드

 

클래스

리턴 타입

메소드(매개 변수)

LocalDate

LocalTime

LocalDateTime

ZonedDateTime

String

format(DateTimeFormatter formatter)

 

format() 매개값은 DateTimeFormatter 이고, 해당 형식대로 문자열을 리턴한다.

 

LocatDateTime now = LocalDateTime.now();

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(“yyyy년 M월 a h시 m분”);

String nowString = now.format(dateTimeFormatter);

 

System.out.println(nowString); // 2020년 7월 31일 오전 9시 8분