Java Date - LocalDateTime 날짜와 시간 다루기
Local용 날짜와 시간을 다뤄보도록 한다.
자바 Local 날짜와 시간 클래스
- LocalDate
- 날짜만 표현할 때 사용.
- 예) 2025-06-20
- LocalTime
- 시간만 표현할 때 사용
- 예) 08:20:40:221
- LocalDateTime
- LocalDate, LocalTime 합한 것과 같다.
- 2025-06-20ㅆ08:20:40:221
클래스 앞의 Local은 세계 시간을 다루지 않고 특정 지역 위치의 날짜만 다룬다.
개발 대상도 세계 시간을 다루지 않는다면 언급한 클래스들을 사용한다
세계 시간대가 필요 없는 서비스
- 국내의 서비스 제공
- 본인의 생일 또는 기념일에 사용
LocalDate 라이브러리
LocalDate 부터 다뤄보도록 한다. 이 클래스는 날짜만 다룬다.
now
LocalDate now = LocalDate.now();
System.out.println("오늘 날짜: " + now);
오늘 날짜: 2025-06-20
of
LocalDate of = LocalDate.of(2020,1,1);
System.out.println("날짜 지정: " + of);
날짜 지정: 2020-01-01
plusDays
LocalDate of = LocalDate.of(2020,1,1);
System.out.println("날짜 지정: " + of);
LocalDate ofPlusDay = of.plusDays(10);
System.out.println("날짜 지정 (+10): " + of); // 불변
System.out.println("날짜 지정 (+10): " + ofPlusDay); // 값 할당
날짜 지정: 2020-01-01
날짜 지정 (+10): 2020-01-01
날짜 지정 (+10): 2020-01-11
LocalDate 정리
생성
- now() 현재 시간 기준으로 생성함
- of(...) 특정 날짜 기준으로 년 월 일 입력해서 생성함.
계산
- plusDays(...) 특정 일을 더하기
- plusMonths(...) 특정 월을 더하기
- plusYears(...) 특정 년을 더하기
주의점
- 모든 날짜가 불변임
- 불변이므로 변경이 필요한 메소드는 새 객체로 생성해서 반환 값을 받아야 한다.
LocalTime 라이브러리
시간을 다루는 클래스다.
now
LocalTime now = LocalTime.now();
System.out.println("현재 시간: " + now);
현재 시간: 16:31:16.089335700
of
LocalTime of = LocalTime.of(12,30,45,221122);
System.out.println("현재 시간 지정: " + of);
12:30:45.000221122
LocalTime of = LocalTime.of(12,30);
System.out.println("현재 시간 지정: " + of);
12:30
plusSeconds
LocalTime of = LocalTime.of(12,30);
System.out.println("현재 시간 = " + of);
LocalTime ss = of.plusSeconds(10);
System.out.println("현재 시간 (+00:00:10) = " + ss);
현재 시간 = 12:30
현재 시간 (+00:00:10) = 12:30:10
생성
- now() 현재 시간 기준으로 생성함
- of(...) 특정 시간 기준으로 시 분 초 나노 입력해서 생성함.
계산
- plusSeconds(...) 초를 더한다. 불변이기에 새 객체로 반환해야한다.
LocalDateTime 클래스
구조부터 살펴보자.
public final class LocalDateTime ... {
...
private final LocalDate date;
private final LocalTime time;
...
}
보다시피 LocalDate 클래스와 LocalTime 클래스를 같이 활용해서 LocalDateTime 으로 활용하고 있다.
now
LocalDateTime now = LocalDateTime.now();
System.out.println("현재 날짜와 시간: " + now);
현재 날짜와 시간: 2025-06-20T16:55:02.666725300
of
LocalDateTime of = LocalDateTime.of(2019, Month.DECEMBER, 12, 23, 59, 59);
System.out.println("지정된 날짜와 시간: " + of);
지정된 날짜와 시간: 2019-12-12T23:59:59
Month 인자는 숫자 대신 정해진 열거된 Enum 사용해도 된다.
toLocalDate
LocalDateTime of = LocalDateTime.of(2019, Month.DECEMBER, 12, 23, 59, 59);
System.out.println("지정된 날짜와 시간: " + of);
LocalDate localDate = of.toLocalDate();
System.out.println("날짜 표시: " + localDate);
지정된 날짜와 시간: 2019-12-12T23:59:59
날짜 표시: 2019-12-12
toLocalTime
LocalDateTime of = LocalDateTime.of(2019, Month.DECEMBER, 12, 23, 59, 59);
System.out.println("지정된 날짜와 시간: " + of);
LocalTime localTime = of.toLocalTime();
System.out.println("시간 표시: " + localTime);
지정된 날짜와 시간: 2019-12-12T23:59:59
시간 표시: 23:59:59
of(LocalDate date, localTime time)
LocalDateTime of = LocalDateTime.of(2019, Month.DECEMBER, 12, 23, 59, 59);
System.out.println("지정된 날짜와 시간: " + of);
LocalTime localTime = of.toLocalTime();
System.out.println("시간 표시: " + localTime);
LocalDate localDate = of.toLocalDate();
System.out.println("날짜 표시: " + localDate);
LocalDateTime dt = LocalDateTime.of(localDate, localTime);
System.out.println("날짜와 시간 표시: " + dt);
지정된 날짜와 시간: 2019-12-12T23:59:59
시간 표시: 23:59:59
날짜 표시: 2019-12-12
날짜와 시간 표시: 2019-12-12T23:59:59
plusDays
LocalDateTime of = LocalDateTime.of(2019, Month.DECEMBER, 12, 23, 59, 59);
System.out.println("지정된 날짜와 시간: " + of);
LocalDateTime plusDays100 = of.plusDays(100);
System.out.println("날짜와 시간 표시: " + plusDays100);
지정된 날짜와 시간: 2019-12-12T23:59:59
날짜와 시간 표시: 2020-03-21T23:59:59
plusYears
LocalDateTime of = LocalDateTime.of(2019, Month.DECEMBER, 12, 23, 59, 59);
System.out.println("현재 날짜와 시간: " + of);
LocalDateTime plusY2 = of.plusYears(2);
System.out.println("날짜와 시간 표시(+Y2): " + plusY2);
지정된 날짜와 시간: 2019-12-12T23:59:59
날짜와 시간 표시 (+Y2): 2021-12-12T23:59:59
isBefore - 비교
LocalDateTime now = LocalDateTime.now();
System.out.println("현재 날짜와 시간: " + now);
LocalDateTime of = LocalDateTime.of(2019, Month.DECEMBER, 12, 23, 59, 59);
System.out.println("지정된 날짜와 시간: " + of);
System.out.println("현재 시간이 지정된 날짜보다 이전인가요? " + now.isBefore(of));
현재 날짜와 시간: 2025-06-20T17:08:08.682632600
지정된 날짜와 시간: 2019-12-12T23:59:59
현재 시간이 지정된 날짜보다 이전인가요? false
isBefore메소드는 인자로 들어온 지정된 날짜가 현재보다 이전 날짜인지 묻는 것이다. 아니므로 false 값 반환
- now 는 2025년 현재 날짜이다.
- now 의 isBefore 메소드를 사용하여 인자로 들어온 of 인스턴스와 날짜 비교하기
- of(2019) 인스턴스는 now(2025) 인스턴스의 미래의 일이다.
isAfter - 비교
LocalDateTime now = LocalDateTime.now();
System.out.println("현재 날짜와 시간: " + now);
LocalDateTime of = LocalDateTime.of(2019, Month.DECEMBER, 12, 23, 59, 59);
System.out.println("지정된 날짜와 시간: " + of);
System.out.println("현재 시간이 지정된 날짜보다 이후인가요? " + now.isAfter(of));
현재 날짜와 시간: 2025-06-20T17:24:48.218491700
지정된 날짜와 시간: 2019-12-12T23:59:59
현재 시간이 지정된 날짜보다 이후인가요? true
isEquals - 비교
LocalDateTime now = LocalDateTime.now();
System.out.println("현재 날짜와 시간: " + now);
LocalDateTime of = LocalDateTime.of(2019, Month.DECEMBER, 12, 23, 59, 59);
System.out.println("지정된 날짜와 시간: " + of);
System.out.println("현재 시간이 지정된 날짜보다 같은가? " + now.isEqual(of));
현재 날짜와 시간: 2025-06-20T17:25:55.136497900
지정된 날짜와 시간: 2019-12-12T23:59:59
현재 시간이 지정된 날짜보다 같은가? false
euqals, isEquals 둘다 사용 할 수 있는데 차이점이 있다.
equals, isEquals 차이
- isEquals
- 단순하게 비교해서 시간이 같으면 true를 반환한다. 타임존이 다른 경우 시간적으로 같으면 true를 반환한다. 시간을 계산해서 비교해준다는 것이다.
- Seoul +09 는 UTC +0시 와 같으므로 비교할 때 true 반환한다.
- euqals
- 객체 타입과 타임존의 내부 데이터가 구성요소가 같으면 true 반환
- Seoul +09 는 UTC +0시와 같으므로 비교할 때 false 반환한다.