자바 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 |