Back-end/이것이 자바다[신용권 한빛미디어]

java.time 패키지

Ho's log 2021. 10. 25. 21:11

자바 7이전 까지는 Date와 Calendar 클래스를 이용해서 날짜와 시간 정보를 얻을 수 있었다.

Date 클래스의 대부분의 메소드는 Deprecated 되었고 , Date의 용도는 단순히 특정 시점의 날자 정보를 저장하는 역할만 한다 .

Calendar 클래스는 날짜와 시간 정보를 얻기 에는 충분하지만, 

날짜와 시간을 조작하거나 비교하는 기능이 불충분하다. 

 

자바 8부터 날짜와 시간을 나타내는 여러가지 API를 새롭게 추가했다. 

이 API는 java.util 패키지에 없고 별도로 java.time 패키지와 하위 패키로 제공 된다

 

패키지 설명
java.time 날짜와 시간을 나타내는 핵심 API인 LocalDate, LocalTime, LocalDateTime, ZonedDateTime을 포함하고 있다. 이 클래스들을 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 클래스 

 

LocalDate

로컬 날짜 클래스로 날짜 정보만을 저장

두가지 정적 메소드로 얻는다

now() => 컴퓨터의 현재 날짜 정보를 저장한 LocalDate 객체를 리턴

of() => 매개값으로 주어진 날짜 정보를 저장한 LocalDate 객체를 리턴

LocalDate currDate = LocalDate.now();
LocalDate targetDate = LocalDate.of(int year, int month, int dayOfMonth);

 

LocalTime

로컬 시간 클래스로 시간 정보만을 저장,

now() => 컴퓨터의 현재 날짜 정보를 저장한 LocalTime 객체를 리턴

of() => 매개값으로 주어진 날짜 정보를 저장한 LocalTime 객체를 리턴

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

 

LocalDateTime

LocalDated와 LocatTime을 결합한 클래스,

날짜와 시간정보 모두 저장 

now() => 컴퓨터의 현재 날짜 정보를 저장한 LocalDateTime 객체를 리턴

of() => 매개값으로 주어진 날짜 정보를 저장한 LocalDateTime 객체를 리턴

 

LocalDateTime currDateTime = LocalDateTime.now();
LocalDateTime targetTime = LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minutem int second, int nanoOfsecond);

 

ZonedDateTime

ISO-8601 달력 시스템에서 정의하고 있는 타임존(time-zone)의 날짜와 시간을 저장하는 클래스 

저장 형태는 2014-04-21T07:50:24.017+09:00[Asia/Seoul]와 같이 맨뒤에 타임존에 대한 정보(+-존오프셋[존아이디])가 추가적으로 붙는다  

 

*존오프셋 (ZoneOffset)은 협정세계시(UTC: Universal Time Corrdinated)와 차이나는 시간 (시차)를 말한다

ZoneDateTime은 now() 정적 메소드에 ZoneId를 매개값으로 주고 얻을 수 있다. 

Zoneid는 of() 메소드로 얻을 수 있는데, of()의 매개값은 java.util.TimeZone의 getAvailableIDs() 메소드가 리턴하는 유효값 중 하나 

 

ZonedDateTime utcDateTime = ZonedDateTime.now(ZoneId.of("UTC"));
ZonedDateTime londonDateTime = ZonedDateTime.now(ZoneId.of("Europe/London"));
ZonedDateTime seoulDateTime = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));

 

Instant

날짜와 시간의 정보를 얻거나 조작하는데 사용되지 않고, 특정 시점의 타임스탬프(Time-Stamp)로 사용

 

특정한 두 시점 간의 시간적 우선순위를 따질 때 사용

java.util.Date 와 가장 유사한 클래스 이지만, 차이점은 Date 로컬 컴퓨터의 현재 날짜와 시간정보를 기준 

Instatnt 는 협정 세계시(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("instat1이 늦습니다.");
}
else {
	System.out.println("동일한 시간 입니다.");
}

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

 

isBefor(), isAfter()는 시간의 앞뒤 여부를 확인하는 메소드 , until()메소드는 두 시점간의 차이를 리턴 

 

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

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() 존오프셋(시차)을 리턴

 

날짜와 시간을 조작하기

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

 

빼기와 더하기 

클래스 리턴타입 메소드(매개변수) 설명
LocalDate
LocalDateTime
ZonedDateTime
LocalDate
LocalDateTime
ZonedDateTime
minusYears(long) 년빼기 
minusMonths(long) 달빼기
minusDay(long) 일빼기
minusWeeks(long) 주빼기
plusYears(long) 년 더하기
plusMonths(long) 달 더하기
plusWeeks(long) 주 더하기
plusDay(long) 일 더하기
LocalTime
LocalDateTime
ZonedDateTime
LocalTime
LocalDateTime
ZonedDateTime
minusHours(long) 시간 빼기
minusMinutes(long) 분 뺴기
minusSeconds(long) 초 빼기
misnusNanos(long) 나노초 빼기
plusHours(long) 시간 더하기
plusMinutes(long) 분 더하기
plusSeconds(long) 초 더하기
plusNanos(long) 나노초 더하기 

 

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

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

 

변경하기

다음은 날짜와 시간을 변경하는 메소드들 이다

클래스 리턴 타입 메소드(매개 변수) 설명
LocalDate
LocalDateTime
ZonedDateTime
LocalDate
LcalDateTime
ZonedDateTime
wiithYear(int) 년 변경
withMonth(int) 월 변경
withDayOfMonth(int) 월의 일 변경
withDayOfYear(int) 년의 일 변경
with(TemporalAdjuster adjuster) 상대변경
LocalTime
LocalDateTime
ZonedDateTime
LocalTime
LocalDateTime
ZonedDateTime
withHour(int) 시간 변경
withMinute(int) 분 변경
withSecond(int) 초 변경
withNano(int) 나노초 변경 

 

with(TemporalAdjuster adjuster) 메소드를 제외한 나머지는 메소드 이름만 보면 어떤 정보를 수정하는지 알수 있다.

 

with() 메소드는 상대 변경이라고 설명 되어 있는데,

이것은 현재 날짜를 기준으로 해의 첫번째 일 또는 마지막 일, 달의 첫 번재 일 또는 마지막 일, 달의 첫번째 요일, 지난 요일 및 돌아오는 요일 등 상대적인 날짜를 리턴한다. 

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

리턴 타입 메소드(매개 변수) 설명
TemporalAdjuster firstDayOfYear() 이번 해의 첫 번째 일 
lastDayOfYear() 이번 해의 마지막 일
firstDayOfNextYear() 다음 해의 첫 번째 일
firstDayOfMonth() 이번 달의 첫 번째 일
lastDayOfMonth() 이번 달의 마지막 일
firstDayOfnewMonth() 다음 달의 첫 번째 일
firstInMonth(DayOfWeek dayOfWeek) 이번달의 첫번째 요일
lastInMoth(DayOfWeek dayOfWeek) 이번달의 마지막 요일
next(DayOfWeek dayOfWeek) 돌아오는 요일
nextOrSame(DayOfWeek dayOfWeek) 돌아오늘 요일(오늘 포함)
previous(DayOfWeek dayOfWeek) 지난 요일
previousOrSame(DayOfWeek dayOfwwek) 지난 요일(오늘 포함 )

 

ex) targetDatetime = now.withYear(2024);

targetDatetime = now.with(TemporalAdjusters.firstDayOfMonth())

targetDateTime = now.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY))

 

날짜와 시간을 비교하기

 

클래스 리턴타입 메소드(매개 변수) 설명
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(
   Temporal startInclusive,
   Temporal endExclusive
)
시간 차이
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 int getYears() 년의 차이
int getMonths() 달의 차이
int getDays() 일의 차이
Duration int getSeconds() 초의 차이
int getNano() 나노초의 차이

 

파싱와 포멧팅

날짜와 시간 클래스는 문자열을 파싱(parsing) 해서 날자와 시간을 생성하는 메소드와

날짜와 시간을 포맷팅(Fomatting) 된 문자열로 변환하는 메소드를 제공 

 

파싱(Parsing) 메소드

날짜와 시간을 생성하는 두개의 parse() 정적 메소드 

클래스 리턴 타입 메소드(매개 변수)
LocalDate
LocalTime
LocalDateTime
ZonedDateTime
LocalDate
LocalTime
LocalDateTime
ZonedDateTime
parse(CharSequence)
parse(CharSequence, DateTimeFormmater)

 

LocalDate의 parse(CharSequence) 메소드는 기본적으로 ISO_LOCAL_DATE 포맷터를 사용해서 문자열을 파싱.

ISO_LOCAL_DATE 는 DateTimeFormmater 의 상수로 정의되어 있는데 

"2024-05-03" 형식의 포맷터 

 

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

 

 만약 다른 포맷터를 이용해서 문자열을 파싱하고 싶다면 parse(CharSequence, DateTime Fommater) 메소드를 사용할수 있다. 

DateTimeformmater 는 ofPattern()메소드로 정의할수 있다

 

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
LocalDate localDate = LocalDate.parse("2024.05.21" , formatter);

 

ofPatter() 메소드의 매개값으로 사용되는 패턴 기호에 대한 설명은 

-> API 도큐먼트의 java.time.format.DateTimeFormmater 클래스 설명 부분에

"Patterns for Formatting and Parsing" 이란 제목으로 잘 나와있다.

DateTimeFormmater 에는 표준화된 포멧터들이 다음과 같이 상수로 미리 정의되어 있기 때문에

ofPattern()메소드를 사용하지 않고 바로 이용 

 

parse(CharSequence)와 동일하게 "2024-05-21"이라는 문자열을 파싱해서 LocalDate 객체를 얻고 싶다면

LocalDate localDate = LocalDate.parse("2024-05-21", DateTimeFormatter.ISO_LOCAL_DATE);
상수 설명
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:15:30+01:00"
ISO_ZONED_DATE_TIME Zoned Date Time "2011-1203T10:15:30+01:00[Europe/Paris]"
ISO_DATE_TIME Date and Time with Zoneld "2011-1203T10: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"

 

 

포맷팅(Formatting) 메소드

날짜와 시간을 포멧팅된 문자열로 변환시키는 format()메소드

클래스 리턴타입 메소드(매개변수)
LocalDate
LocalTime
LocalDateTime
ZonedDateTime
String format(dateTimeFormmater formatter)

 

format()의 매개값은 DateTimeFormatter 인데 해당 형식대로 문자열을 리턴

LocalDateTime 으로부터 "2024년 5월 21일 오후 6시 30분" 과같은 문자열을 얻는 코드

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter datetimeFormmater = DateTimeFormatter.ofPatter("yyyy년 M월 d일 a h시 m분");

String nowString = now.format(dateTimeFormatter);

'Back-end > 이것이 자바다[신용권 한빛미디어]' 카테고리의 다른 글

작업 스레드 생성과 실행  (0) 2021.11.24
멀티 스레드 개념  (0) 2021.11.22
Format 클래스  (0) 2021.10.24
Date, Calender 클래스  (0) 2021.10.24
Math, Random 클래스  (0) 2021.10.24