Java

[Java] 기본 API 클래스⑩ java.time 패키지

망고고래 2024. 4. 8. 19:25

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("유통기한이 지나지 않았습니다.");
}