[Java] 기본 API 클래스⑩ java.time 패키지
what?
날짜와 시간을 다루는 패키지
why?
기존의 Date와 Calendar를 보완함
how?
1. java.time 패키지와 하위 패키지
1) java.time: 날짜와 시간을 나타내는 LocalDate, LocalTime 등을 포함한 패키지
2) java.time.format: 날짜와 시간을 파싱하고 포맷팅하는 API 포함
3) java.time.chrono: 여러 가지 달력 시스템을 사용할 수 있는 API 포함
4) java.time.temporal: 날짜와 시간을 연산하기 위한 API 포함
5) java.time.zone: 타임존을 지원하는 API 포함
java.time 패키지의 시간을 변경할 수는 있지만, 실제로는 변경되는 것이 아니라 새로운 객체가 반환됨
2. time 패키지의 시간과 날짜 클래스 종류
1)LocalDate 클래스
날짜 정보가 저장됨
now(): 현재 날짜 지정, 있는 객체를 그대로 가져옴
of(): 특정 날짜 지정, 인스턴스를 만들어서 옴
LocalDate ld = LocalDate.now();
LocalDate mld = LocalDate.of(int year, int month, int dayOfMonth);
//두 방법 모두 싱글턴
2)LocalTime 클래스
시간 정보가 저장됨
now(): 현재 시간 지정
of(): 특정 시간 지정
LocalTime lt = LocalTime.now();
LocalTime mlt = LocalTime.of(int hour, int minute);
LocalTime mlt2 = LocalTime.of(int hour, int minute, int second);
LocalTime mlt3 = LocalTime.of(int hour, int minute, int second, int nanoOfSecond);
3)LocalDateTime 클래스
LocalDate + LocalTime, 날짜와 시간 정보 모두 저장
now(): 현재 날짜와 시간 정보 지정
of(): 특정 날짜와 시간 정보 지정
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime mldt = LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond);
4)ZonedDateTime 클래스
ISO-8601 달력 시스템에서 정의하는 TimeZone에 따라 날짜와 시간 저장
2024-04-08T18:44:25.017+09:00[Asia/Seoul]
ZonedDateTime zdt = ZonedDateTime.now(Zoneld.of("UTC"));
5)Instant
특정 시점의 타임스탬프 객체
밀리세컨드 -> 사람이 사용하기보다 machine time에 사용
Instant i1 = Instant.now();
3. 클래스 정보값 읽어오기
1)LocalDate/LocalTime
LocalDAte
리턴타입 | 메서드 | 설명 |
int | getYear() | 년도 |
Month | getMonth() | Month의 열거값 |
int | getMonthValue() | 월 |
int | getDayOfYear() | 1년의 몇 번째 일 |
int | getDayOfMonth() | 월의 몇 번째 일 |
DayOfWeek | getDayOfWeek() | 요일 |
boolean | isLeapYear() | 윤년 여부 |
LocalTime
리턴타입 | 메서드 | 설명 |
int | getHour() | 시간 |
int | getMinute() | 분 |
int | getSecond() | 초 |
int | getNano() | 나노초 |
LocalDateTime은 날짜와 시간 정보를 모두 가지고 있기 때문에 위의 메서드들을 대부분 가지고 있다. 단, isLeapYear() 메서드는 toLocalDate()로 LocalDate 클래스로 변환한 뒤에 사용한다.
4. 클래스들의 정보 더하기/빼기
LocalDate, LocalTime, LocalDateTime, ZonedDateTime 등
minusYears(long): 년도 빼기
minusMonths(long): 월 빼기
minusDays(long): 일 빼기
minusWeeks(long): 주 빼기
plusYears(long): 년도 더하기
plusMonths(long): 월 더하기
plusDays(long): 일 더하기
plusWeeks(long): 주 더하기
minusHours(long): 시간 빼기
minusMinutes(long): 분 빼기
minusSeconds(long): 초 빼기
minusNanos(long): 나노초 빼기
plusHours(long): 시간 더하기
plusMinutes(long): 분 더하기
LocalDate ld = LocalDate.now();
System.out.println(ld);
LocalDate ld2 = ld.minusYears(2).plusMonths(3).minusDays(4);
System.out.println(ld2);
LocalDate ld3 = ld2.minusDays(3);
System.out.println(ld3);
LocalDate ld4 = ld3.plusWeeks(3);
System.out.println(ld4);
5. 클래스들의 정보 값 변경
각 클래스 공통
메서드 | 설명 |
withYear(int) | 년 변경 |
withMonth(int) | 월 변경 |
withDayOfMonth(int) | 월의 일 변경 |
withDayOfYear(int) | 년의 일 변경 |
withHour(int) | 시간 변경 |
withMinute(int) | 분 변경 |
withSecond(int) | 초 변경 |
withNano(int) | 나노초 변경 |
LocalDate ld = LocalDate.now();
System.out.println(ld);
LocalDate new_ld = ld.withYear(1999).withMonth(8).withDayOfYear(23);
System.out.println(new_id);
//withDayOfYear(23) 때문에 1월 23일로 출력됨
with 메서드는 TemporalAdjuster 타입을 인자로 받으면 특정한 날짜를 리턴한다.(인자로 넘어온 객체의 년도, 그 연도의 첫 번째 일 등)
메서드 | 설명 |
firstDayOfYear() | 년도의 첫 번째 일 |
lastDayOfYear() | 년도의 마지막 일 |
firstDayOfMonth() | 달의 첫 번째 일 |
lastDayOfMonth() | 달의 마지막 일 |
firstInMonth(DayOfWeek dayOfWeek) | 달의 첫 번째 요일 |
lastInMonth(DayOfWeek dayOfWeek) | 달의 마지막 요일 |
next(DayOfWeek dayOfWeek) | 돌아오는 요일 |
nextorSame(DayOfWeek dayOfWeek) | 오늘을 포함한 돌아오는 요일 |
previous(DayOfWeek dayOfWeek) | 지난 요일 |
previousOrSame(DayOfWeek dayOfWeek) | 오늘을 포함한 지난 요일 |
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
LocalDateTime new_ldt;
//올해의 첫 번째 날
new_ldt = ldt.with(TemporalAdjusters.firstDayOfYear());
//올해의 마지막 날
new_ldt = ldt.with(TemporalAdjusters.lastDayOfYear());
//이번달의 첫 번째 날
new_ldt = ldt.with(TemporalAdjusters.firstDayOfMonth());
//이번달의 마지막 날
new_ldt = ldt.with(TemporalAdjusters.lastDayOfMonth());
//이번달의 첫 월요일
new_ldt = ldt.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
//이번달의 마지막 일요일
new_ldt = ldt.with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));
//돌아오는 금요일
new_ldt = ldt.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
//오늘을 포함한 다음 금요일
new_ldt = ldt.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));
//지난 월요일
new_ldt = ldt.with(TemporalAdjusters.previous(DayOfWeek.MONDAY));
//오늘을 포함한 지난 월요일
new_ldt = ldt.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY))
6. 클래스들의 정보 값 비교
메서드 | 설명 |
isAfter() | 이전의 날짜인지 비교 |
isBefore() | 지난 날짜인지 비교 |
isEqual() | 동일 날짜인지 비교 |
until() | 날짜나 시간의 차이 반환 |
between() | 전체 날짜나 시간의 차이 반환 |
유통기한 확인하기
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime end_time = LocalDateTime.of(2024, 6, 24, 10, 00);
if(ldt.isAfter(end_time)){
System.out.println("유통기한이 지났습니다.");
}else{
System.out.println("유통기한이 지나지 않았습니다.");
}