자바 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분
'Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어] > 9. 기본 API 클래스' 카테고리의 다른 글
15. Java 자바 [API] - Format 클래스 (0) | 2020.09.29 |
---|---|
14. Java 자바 [API] - Date, Calendar 클래스 (0) | 2020.09.29 |
13. Java 자바 [API] - Math, Random 클래스 (0) | 2020.09.29 |
12. Java 자바 [API] - Wrapper (포장) 클래스 (0) | 2020.09.29 |
11. Java 자바 [API] - Arrays 클래스 (0) | 2020.09.29 |