1. 자바 날짜와 시간 라이브러리

LocalDate, LocalTime, LocalDateTime
- LocalDate
- 날짜만 표현할 때 사용한다. 년, 월, 일을 다룬다. ex) 2013-11-21
- LocalTime
- 시간만을 표현할 때 사용. 시, 분, 초를 다룸. ex) 08.20.30.213
- LocalDateTime
- LocalDate 와 LocalTime을 합한 개념. ex) 2013-11-21T08:20:30.213
- 타임존 적용 x
ZonedDateTime, OffsetDateTime
- ZonedDateTime
- 시간대를 고려한 날짜와 시간을 표현할 때 사용. 타임존 포함
- ex) 2013-11-21T08:20:30.213+9:00[Asia/Seoul]
- +9:00은 UTC로부터의 시간대 차이. 오프셋이라함.
- 일광 절약 시간제가 적용
- OffsetDateTime
- 시간대를 고려한 날짜와 시간을 표현할 때 사용.
- ` 2013-11-21T08:20:30.213+9:00
- 일광 절약제 적용 x
Year, Month, YearMonth, MonthDay
- 년, 월, 년월, 달일을 각각 다룰 때 사용한다. 자주 사용하지는 않는다. ` DayOfWeek `와 같이 월, 화, 수, 목, 금, 토, 일을 나타내는 클래스도 있다.
Instant
- UTC(협정 세계시)를 기준으로 하는, 시간의 한 지점을 나타냄. Instant는 날짜와 시간을 나노초 정밀도로 표현
- 쉽게 말해서 Instant 내부에는 초 데이터만 들어있다.(나노초 포함)
Period, Duration
- Period
- 두 날짜 사이의 간격을 년, 월, 일 단위로 나타낸다.
- Duration
- 두 시간 사이의 간격을 시, 분, 초 단위로 나타낸다.
2. 기본 날자와 시간 - LocalDateTime
LocalDate
package practice.time;
import java.time.LocalDate;
public class LocalDateMain {
public static void main(String[] args) {
LocalDate nowDate = LocalDate.now();
LocalDate ofDate = LocalDate.of(2025, 3,15);
System.out.println("오늘날짜 = " + nowDate);
System.out.println("지정날짜 = " + ofDate);
LocalDate plusDays = nowDate.plusDays(10);
System.out.println("지정날짜 + 10D = " + plusDays);
}
}
실행결과
오늘날짜 = 2025-03-16
지정날짜 = 2025-03-15
지정날짜 + 10D = 2025-03-26
메서드
- 생성
- now() : 현재 시간을 기준으로 생성
- of(...) : 특정 날짜를 기준으로 생성한다. 년, 월, 일 입력 가능
- 계산
- plusDays() : 특정 일을 더한다. 다양한 plusXxx() 메서드 존재
- 불변
- 모든 날짜 클래스는 불변객체이다. 따라서 변경이 발생하는 경우 새로운 객체를 생성해서 반환하므로 반환값을 꼭 받아야한다.
LocalTime
package practice.time;
import java.time.LocalTime;
public class LocalTimeMain {
public static void main(String[] args) {
LocalTime nowTime = LocalTime.now();
LocalTime ofTime = LocalTime.of(16, 19, 40);
System.out.println("현재 시간 = " + nowTime);
System.out.println("지정 시간 = " + ofTime);
LocalTime plusTime = nowTime.plusSeconds(60);
System.out.println("현재 시간 + 30s = " + plusTime);
}
}
실행결과
현재 시간 = 16:20:49.642760800
지정 시간 = 16:19:40
현재 시간 + 30s = 16:21:49.642760800
- 메서드
- 생성
- now() : 현재 시간을 기준으로 생성
- of() : 특정 시간을 기준으로 생성한다. 시, 분, 초, 나노초를 입력할 수 있다.
- 계산
- plusSeconds() : 특정 초를 더한다. 다양한 plusXxx() 메서드 존재
- 생성
LocalDateTime
package practice.time;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class LocalDateTimeMain {
public static void main(String[] args) {
LocalDateTime nowDateTime = LocalDateTime.now();
LocalDateTime ofDateTime = LocalDateTime.of(2025, 3, 15, 20, 30);
System.out.println("현재 날짜시간 = " + nowDateTime);
System.out.println("지정 날짜시간 = " + ofDateTime);
// 날짜와 시간 분리
LocalDate localDate = nowDateTime.toLocalDate();
LocalTime localTime = nowDateTime.toLocalTime();
System.out.println("localDate = " + localDate);
System.out.println("localTime = " + localTime);
// 날짜와 시간 합체
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
System.out.println("localDateTime = " + localDateTime);
// 계산(불변객체)
LocalDateTime nowDtPlus = nowDateTime.plusDays(1000);
System.out.println("현재 날짜 + 1000D = " + nowDtPlus);
LocalDateTime nowDtPlusYear = nowDateTime.plusYears(1);
System.out.println("현재 날짜 + 1Year = " + nowDtPlusYear);
// 비교
System.out.println("현재 날짜시간이 지정 날짜보다 이전인가? " + nowDateTime.isBefore(ofDateTime));
System.out.println("현재 날짜 시간이 지정날짜보다 이후인가? " + nowDateTime.isAfter(ofDateTime));
System.out.println("현재 날짜시간과 지정날짜시간이 같은가? " + nowDateTime.isEqual(ofDateTime));
}
}
실행결과
현재 날짜시간 = 2025-03-16T16:28:55.430932400
지정 날짜시간 = 2025-03-15T20:30
localDate = 2025-03-16
localTime = 16:28:55.430932400
localDateTime = 2025-03-16T16:28:55.430932400
현재 날짜 + 1000D = 2027-12-11T16:28:55.430932400
현재 날짜 + 1Year = 2026-03-16T16:28:55.430932400
현재 날짜시간이 지정 날짜보다 이전인가? false
현재 날짜 시간이 지정날짜보다 이후인가? true
현재 날짜시간과 지정날짜시간이 같은가? false
- 메서드
- 생성
- now() : 현재 날짜와 시간 기준으로 생성
- of() : 특정 날짜와 시간 기준으로 생성
- 분리
- 날짜(LocalDate)와 시간(LocalTime) 을 toXxx() 메서드로 분리할 수 있다.
- 합체
- LocalDateTime.of(localDate, localTime) 날짜와 시간을 이용해서 LocalDatetime을 만들 수 있다.
- 계산
- plusXxx() : 특정날짜와 시간을 더한다. 다양한 plusXxx()메서드 존재.
- 비교
- isBefore() : 다른 날짜시간과 비교한다. 현재 날짜와 시간이 이전이라면 true를 반환.
- isAfter() : 다른 날짜시간과 비교. 현재 날짜와 시간이 이후라면 true를 반환
- isEqual() : 다른 날짜시간과 비교. 현재 날짜와 시간이 동일하다면 true를 반환.
- isEquals() vs equals()
- isEquals는 단순히 비교대상이 시간적으로 같으면 true를 반환. 객체가 다르고, 타임존이 달라도 시간적으로 같으면 true를 반환한다.
- ex) 서울의 9시와 UTC의 0시는 시간적으로 같다. 이 둘을 비교하면 true를 반환
- equals() : 객체의 타입, 타임존 등등 내부 데이터의 모든 구성요소가 같아야 true를 반환
- ex) 서울의 9시와 UTC 0시는 시간적으로 같다. 이 둘을 비교하면 타임존의 데이터가 다르기때문에 false를 반환.
- isEquals는 단순히 비교대상이 시간적으로 같으면 true를 반환. 객체가 다르고, 타임존이 달라도 시간적으로 같으면 true를 반환한다.
- 생성
3. 기간, 시간의 간격 - Duration, Period
Period
- 두 날짜 사이의 간격을 년, 월, 일 단위로 나타낸다.
- 예시
- 이 프로젝트는 3개월 정도 걸릴거 같아
- 기념일이 183일 남았다.
- 프로젝트 시작일과 종료일 사이의 간격: 프로젝트 기간
Duration
- 두 시간 사이의 간격을 시, 분, 초(나노초) 단위로 나타낸다.
- 예시
- 라면을 끓이는 시간 3분
- 영화 상영 시간은 2시간 30분
- 서울에서 부산까지 4시간

PeriodMain
package practice.time;
import java.time.LocalDate;
import java.time.Period;
public class PeriodMain {
public static void main(String[] args) {
// 생성
Period period = Period.ofYears(10);
System.out.println("period = " + period);
// 계산에 사용
LocalDate currentDate = LocalDate.of(2025, 3, 16);
LocalDate plusDate = currentDate.plus(period);
System.out.println("현재날짜: " + currentDate);
System.out.println("더한날짜: " +plusDate);
// 기간 차이
LocalDate startDate = LocalDate.of(2025, 1, 1);
LocalDate endDate = LocalDate.of(2025, 3, 16);
Period between = Period.between(startDate, endDate);
System.out.println("기간: " + between.getMonths() + "개월, " + between.getDays() + "일");
}
}
실행결과
period = P10Y
현재날짜: 2025-03-16
더한날짜: 2035-03-16
기간: 2개월, 15일
- 메서드
- 생성
- of() : 특정 기간을 지정해서 Period를 생성
- of(년, 월, 일)
- ofDays()
- ofMonths()
- ofYears()
- of() : 특정 기간을 지정해서 Period를 생성
- 계산에 사용
- 2025년-03-16에 10년을 더하면 2035년 3월 16일이 된다. 특정날짜에 기간을 더할 수 있다.
- 기간 차이
- Period.between(startDate, endDate)와 같이 특정 날짜의 차이를 구하면 Period가 반환된다.
- 생성
DurationMain
package practice.time;
import java.time.Duration;
import java.time.LocalTime;
public class DurationMain {
public static void main(String[] args) {
// 생성
Duration duration = Duration.ofMinutes(30);
System.out.println("duration = " + duration);
LocalTime lt = LocalTime.of(1, 0);
System.out.println("기준시간 = " + lt);
// 계산에 사용
LocalTime plusTime = lt.plus(duration);
System.out.println("더한시간 = " + plusTime);
// 시간 차이
LocalTime startTime = LocalTime.of(9, 0);
LocalTime endTime = LocalTime.of(10, 0);
Duration between = Duration.between(startTime, endTime);
System.out.println("차이: " + between.getSeconds());
System.out.println("근무 시간: " + between.toHours() + "시간 " +
between.toMinutesPart() + "분");
}
}
실행결과
duration = PT30M
기준시간 = 01:00
더한시간 = 01:30
차이: 3600
근무 시간: 1시간 0분
- 메서드
- 생성
- of() : 특정 시간을 지정해서 Duration를 생성
- of(년, 월, 일)
- ofSeconds()
- ofMinutes()
- ofHours()
- of() : 특정 시간을 지정해서 Duration를 생성
- 계산에 사용
- 1:00에 30분을 더하면 1:30이된다. 특정시간에 시간(시간의 간격)을 더할 수 있다.
- 기간 차이
- Duration.between(startTime, endTime)와 같이 특정 시간의 차이를 구하면 Duration가 반환된다.
- 생성
날짜와 시간의 핵심 인터페이스

TemporalAccessor 인터페이스
- 날짜와 시간을 읽기 위한 기본 인터페이스
- 이 인터페이스는 특정 시점의 날짜와 시간 정보를 읽을 수 있는 최소한의 기능을 제공
Temporal 인터페이스
- TemporalAccessor의 하위 인터페이스로, 날짜와 시간을 조작하기 위한 기능을 제공. 이를 통해 날짜와 시간을 변경하거나 조작할 수 있다.
- 간단히 말하면, TemporalAccessor는 읽기 전용 접근을, Temporal은 읽기와 쓰기 모두를 지원
TemporalAmount 인터페이스
- 시간의 간격을 나타내며, 날짜와 시간 객체에 적용하여 그객체를 조정할 수 있다.
출처: 김영한 자바 중급1
'Java' 카테고리의 다른 글
| Java 중급 1 - 날짜와 시간(3) (0) | 2025.03.23 |
|---|---|
| Java 중급 1 - 날짜와 시간(2) (0) | 2025.03.19 |
| Java 중급 1 - 열거형 Enum (0) | 2025.02.24 |
| Java 중급 1 - Wrapper Class (0) | 2025.02.24 |
| Java 중급 1 - String (0) | 2025.02.14 |