[Java 개념노트 43] 날짜와 시간 API 이해하기
안녕하세요. Java 개념노트 시리즈 마흔세 번째 글입니다.
지난 글에서는 다양한 랜덤 값을 만들 수 있는 Random 클래스에 대해 정리했습니다. 이번 글에서는 자바에서 날짜와 시간을 다룰 때 사용하는 날짜와 시간 API에 대해 알아보겠습니다.
프로그램을 만들다 보면 오늘 날짜, 현재 시간, 가입일, 주문일, 마감일, 예약 시간처럼 날짜와 시간을 다뤄야 하는 경우가 많습니다. 자바에서는 java.time 패키지를 사용해서 날짜와 시간을 편리하게 처리할 수 있습니다.
1. 날짜와 시간 API란?
날짜와 시간 API는 날짜, 시간, 날짜와 시간을 표현하고 계산하기 위한 자바의 기본 기능입니다.
자바에서는 LocalDate, LocalTime, LocalDateTime 같은 클래스를 사용해서 날짜와 시간을 다룰 수 있습니다.
쉽게 말하면
날짜와 시간 API는 오늘 날짜, 현재 시간, 날짜 계산, 날짜 비교를 쉽게 처리할 수 있게 해주는 자바의 시간 도구입니다.
2. java.time 패키지
날짜와 시간 관련 클래스들은 주로 java.time 패키지에 있습니다. 사용하려면 필요한 클래스를 import해야 합니다.
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
대표 클래스는 다음과 같습니다.
| 클래스 | 역할 | 예시 |
LocalDate |
날짜만 표현합니다. | 2026-06-15 |
LocalTime |
시간만 표현합니다. | 14:30:00 |
LocalDateTime |
날짜와 시간을 함께 표현합니다. | 2026-06-15T14:30:00 |
DateTimeFormatter |
날짜와 시간을 원하는 문자열 형식으로 바꿉니다. | 2026년 06월 15일 |
3. LocalDate로 날짜 다루기
LocalDate는 날짜만 표현하는 클래스입니다. 연도, 월, 일을 다룰 때 사용합니다.
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
System.out.println(today);
}
}
실행 결과는 실행하는 날짜에 따라 달라집니다.
2026-06-15
LocalDate.now()는 현재 날짜를 가져옵니다.
4. 원하는 날짜 만들기
특정 날짜를 직접 만들고 싶다면 LocalDate.of()를 사용합니다.
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2026, 6, 15);
System.out.println(date);
}
}
실행 결과는 다음과 같습니다.
2026-06-15
LocalDate.of(연도, 월, 일) 형태로 날짜를 만들 수 있습니다.
5. LocalTime으로 시간 다루기
LocalTime은 시간만 표현하는 클래스입니다. 시, 분, 초를 다룰 때 사용합니다.
import java.time.LocalTime;
public class Main {
public static void main(String[] args) {
LocalTime now = LocalTime.now();
System.out.println(now);
}
}
실행 결과는 실행하는 시간에 따라 달라집니다.
14:30:25.123456
LocalTime.now()는 현재 시간을 가져옵니다.
6. 원하는 시간 만들기
특정 시간을 직접 만들고 싶다면 LocalTime.of()를 사용합니다.
import java.time.LocalTime;
public class Main {
public static void main(String[] args) {
LocalTime time = LocalTime.of(14, 30, 0);
System.out.println(time);
}
}
실행 결과는 다음과 같습니다.
14:30
초가 0이면 출력에서 생략되어 보일 수 있습니다.
7. LocalDateTime으로 날짜와 시간 함께 다루기
LocalDateTime은 날짜와 시간을 함께 표현하는 클래스입니다.
import java.time.LocalDateTime;
public class Main {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
}
}
실행 결과는 다음과 비슷합니다.
2026-06-15T14:30:25.123456
날짜와 시간 사이에 T가 들어가 있는 것을 볼 수 있습니다. 이는 날짜와 시간을 구분하는 기본 표현입니다.
8. 원하는 날짜와 시간 만들기
특정 날짜와 시간을 직접 만들고 싶다면 LocalDateTime.of()를 사용합니다.
import java.time.LocalDateTime;
public class Main {
public static void main(String[] args) {
LocalDateTime dateTime = LocalDateTime.of(2026, 6, 15, 14, 30);
System.out.println(dateTime);
}
}
실행 결과는 다음과 같습니다.
2026-06-15T14:30
9. 날짜 정보 꺼내기
LocalDate에서 연도, 월, 일 정보를 각각 꺼낼 수 있습니다.
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2026, 6, 15);
System.out.println(date.getYear());
System.out.println(date.getMonthValue());
System.out.println(date.getDayOfMonth());
System.out.println(date.getDayOfWeek());
}
}
실행 결과는 다음과 같습니다.
2026
6
15
MONDAY
getDayOfWeek()는 요일 정보를 반환합니다.
10. 시간 정보 꺼내기
LocalTime에서 시, 분, 초 정보를 꺼낼 수 있습니다.
import java.time.LocalTime;
public class Main {
public static void main(String[] args) {
LocalTime time = LocalTime.of(14, 30, 25);
System.out.println(time.getHour());
System.out.println(time.getMinute());
System.out.println(time.getSecond());
}
}
실행 결과는 다음과 같습니다.
14
30
25
11. 날짜 더하기
날짜에 일, 월, 년을 더할 때는 plusDays(), plusMonths(), plusYears()를 사용할 수 있습니다.
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2026, 6, 15);
System.out.println(date.plusDays(7));
System.out.println(date.plusMonths(1));
System.out.println(date.plusYears(1));
}
}
실행 결과는 다음과 같습니다.
2026-06-22
2026-07-15
2027-06-15
12. 날짜 빼기
날짜에서 일, 월, 년을 뺄 때는 minusDays(), minusMonths(), minusYears()를 사용할 수 있습니다.
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2026, 6, 15);
System.out.println(date.minusDays(7));
System.out.println(date.minusMonths(1));
System.out.println(date.minusYears(1));
}
}
실행 결과는 다음과 같습니다.
2026-06-08
2026-05-15
2025-06-15
주의LocalDate는 불변 객체입니다. plusDays()나 minusDays()를 호출해도 원본 날짜가 바뀌는 것이 아니라 새 날짜가 반환됩니다.
13. 원본 날짜는 바뀌지 않는다
날짜 계산 메서드는 원본 객체를 바꾸지 않고 새로운 결과를 반환합니다.
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2026, 6, 15);
LocalDate result = date.plusDays(10);
System.out.println(date);
System.out.println(result);
}
}
실행 결과는 다음과 같습니다.
2026-06-15
2026-06-25
원본 date는 그대로이고, result에 계산된 새 날짜가 저장되었습니다.
14. 시간 더하고 빼기
LocalTime도 시간을 더하거나 뺄 수 있습니다.
import java.time.LocalTime;
public class Main {
public static void main(String[] args) {
LocalTime time = LocalTime.of(14, 30);
System.out.println(time.plusHours(2));
System.out.println(time.plusMinutes(15));
System.out.println(time.minusHours(1));
System.out.println(time.minusMinutes(10));
}
}
실행 결과는 다음과 같습니다.
16:30
14:45
13:30
14:20
15. 날짜 비교하기
날짜를 비교할 때는 isBefore(), isAfter(), isEqual()을 사용할 수 있습니다.
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate date1 = LocalDate.of(2026, 6, 15);
LocalDate date2 = LocalDate.of(2026, 6, 20);
System.out.println(date1.isBefore(date2));
System.out.println(date1.isAfter(date2));
System.out.println(date1.isEqual(date2));
}
}
실행 결과는 다음과 같습니다.
true
false
false
date1은 date2보다 이전 날짜이므로 isBefore() 결과가 true입니다.
16. 날짜 차이 구하기
두 날짜 사이의 차이를 구할 때는 Period를 사용할 수 있습니다.
import java.time.LocalDate;
import java.time.Period;
public class Main {
public static void main(String[] args) {
LocalDate start = LocalDate.of(2026, 1, 1);
LocalDate end = LocalDate.of(2026, 6, 15);
Period period = Period.between(start, end);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
}
}
실행 결과는 다음과 같습니다.
0
5
14
Period는 날짜 기반 차이를 년, 월, 일 단위로 표현합니다.
17. 시간 차이 구하기
두 시간 사이의 차이를 구할 때는 Duration을 사용할 수 있습니다.
import java.time.LocalTime;
import java.time.Duration;
public class Main {
public static void main(String[] args) {
LocalTime start = LocalTime.of(9, 0);
LocalTime end = LocalTime.of(14, 30);
Duration duration = Duration.between(start, end);
System.out.println(duration.toHours());
System.out.println(duration.toMinutes());
}
}
실행 결과는 다음과 같습니다.
5
330
toHours()는 전체 시간 차이를 시간 단위로, toMinutes()는 전체 시간 차이를 분 단위로 반환합니다.
18. 날짜를 문자열로 바꾸기
날짜를 원하는 형식의 문자열로 바꾸려면 DateTimeFormatter를 사용합니다.
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
LocalDate date = LocalDate.of(2026, 6, 15);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일");
String result = date.format(formatter);
System.out.println(result);
}
}
실행 결과는 다음과 같습니다.
2026년 06월 15일
19. 문자열을 날짜로 바꾸기
문자열을 날짜 객체로 바꿀 때는 parse()를 사용합니다.
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
String text = "2026-06-15";
LocalDate date = LocalDate.parse(text);
System.out.println(date);
}
}
실행 결과는 다음과 같습니다.
2026-06-15
기본 형식인 yyyy-MM-dd 문자열은 별도 formatter 없이도 파싱할 수 있습니다.
20. 다른 형식의 문자열을 날짜로 바꾸기
문자열 형식이 기본 형식과 다르다면 DateTimeFormatter를 함께 사용해야 합니다.
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
String text = "2026.06.15";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
LocalDate date = LocalDate.parse(text, formatter);
System.out.println(date);
}
}
실행 결과는 다음과 같습니다.
2026-06-15
주의
문자열을 날짜로 바꿀 때는 문자열 형식과 formatter 패턴이 맞아야 합니다. 맞지 않으면 변환 오류가 발생할 수 있습니다.
21. DateTimeFormatter 패턴 정리
자주 사용하는 날짜와 시간 패턴은 다음과 같습니다.
| 패턴 | 의미 | 예시 |
yyyy |
연도 | 2026 |
MM |
월 | 06 |
dd |
일 | 15 |
HH |
시 | 14 |
mm |
분 | 30 |
ss |
초 | 25 |
22. 날짜와 시간 전체 예제
이번에는 날짜 생성, 계산, 비교, 포맷을 함께 사용하는 예제를 보겠습니다.
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
LocalDate today = LocalDate.of(2026, 6, 15);
LocalDate deadline = today.plusDays(30);
System.out.println("오늘: " + today);
System.out.println("마감일: " + deadline);
System.out.println("오늘이 마감일 전인가? " + today.isBefore(deadline));
Period period = Period.between(today, deadline);
System.out.println("남은 개월: " + period.getMonths());
System.out.println("남은 일: " + period.getDays());
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일");
System.out.println("표시용 날짜: " + deadline.format(formatter));
}
}
실행 결과는 다음과 같습니다.
오늘: 2026-06-15
마감일: 2026-07-15
오늘이 마감일 전인가? true
남은 개월: 1
남은 일: 0
표시용 날짜: 2026년 07월 15일
23. 날짜와 시간 API 사용 시 자주 하는 실수
날짜와 시간 API를 처음 사용할 때는 아래와 같은 실수를 자주 합니다.
| 실수 | 문제점 | 해결 방법 |
| 계산 후 원본 날짜가 바뀐다고 생각 | LocalDate는 불변 객체라 원본은 바뀌지 않음 | 반환값을 새 변수에 저장 |
| 문자열 형식과 formatter 패턴 불일치 | parse 오류 발생 가능 | 문자열과 패턴을 정확히 맞춤 |
MM과 mm 혼동 |
MM은 월, mm은 분 |
대소문자 구분해서 사용 |
| LocalDate에 시간 정보를 기대 | LocalDate는 날짜만 가짐 | 시간까지 필요하면 LocalDateTime 사용 |
| Period와 Duration 혼동 | Period는 날짜 차이, Duration은 시간 차이에 적합 | 날짜는 Period, 시간은 Duration으로 구분 |
24. 직접 연습해보기
아래 코드를 직접 작성하고 실행해보세요.
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
LocalDate joinDate = LocalDate.of(2026, 6, 15);
LocalDate expireDate = joinDate.plusDays(90);
System.out.println("가입일: " + joinDate);
System.out.println("만료일: " + expireDate);
System.out.println("가입일이 만료일보다 이전인가? " + joinDate.isBefore(expireDate));
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
System.out.println("표시용 가입일: " + joinDate.format(dateFormatter));
System.out.println("표시용 만료일: " + expireDate.format(dateFormatter));
LocalDateTime now = LocalDateTime.of(2026, 6, 15, 14, 30);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println("현재 날짜와 시간: " + now.format(dateTimeFormatter));
}
}
실행 결과는 다음과 같습니다.
가입일: 2026-06-15
만료일: 2026-09-13
가입일이 만료일보다 이전인가? true
표시용 가입일: 2026.06.15
표시용 만료일: 2026.09.13
현재 날짜와 시간: 2026-06-15 14:30:00
25. 이번 글 정리
이번 글에서는 자바의 날짜와 시간 API에 대해 정리했습니다. 핵심 내용은 다음과 같습니다.
LocalDate는 날짜만 표현한다.LocalTime은 시간만 표현한다.LocalDateTime은 날짜와 시간을 함께 표현한다.now()는 현재 날짜나 시간을 가져온다.of()는 원하는 날짜나 시간을 직접 만든다.plusDays(),minusDays()등으로 날짜 계산을 할 수 있다.- 날짜와 시간 클래스는 불변 객체라 계산 결과를 새 변수에 저장해야 한다.
isBefore(),isAfter(),isEqual()로 날짜를 비교할 수 있다.Period는 날짜 차이를 구할 때 사용한다.Duration은 시간 차이를 구할 때 사용한다.DateTimeFormatter는 날짜와 시간을 원하는 문자열 형식으로 바꿀 때 사용한다.- 문자열을 날짜로 바꿀 때는 문자열 형식과 formatter 패턴이 맞아야 한다.
한 줄 요약
자바의 날짜와 시간 API는 LocalDate, LocalTime, LocalDateTime을 중심으로 날짜 생성, 계산, 비교, 문자열 변환을 처리하는 기능입니다.
다음 글 예고
다음 글에서는 [Java 개념노트 44] 예외 처리란 무엇인가?라는 주제로 프로그램 실행 중 발생할 수 있는 오류를 안전하게 처리하는 방법을 정리해보겠습니다.
GWDEVELBlog Java 개념노트 시리즈

'Computer Science > Java' 카테고리의 다른 글
| [Java] 개념노트 45 throws와 throw 이해하기 (0) | 2026.06.16 |
|---|---|
| [Java] 개념노트 44 예외 처리란 무엇인가? (0) | 2026.06.15 |
| [Java ] 개념노트 42 Random 클래스 이해하기 (0) | 2026.06.15 |
| [Java ] 개념노트 41 Math 클래스 이해하기 (0) | 2026.06.15 |
| [Java ]개념노트 40 Wrapper 클래스 이해하기 (0) | 2026.06.14 |