목차▼
자바에서 날짜와 시간을 다루는 방법은 여러 가지가 있지만, 대표적으로
java.time
, java.util.Date
,
java.util.Calendar
패키지를 사용합니다. 최신 코드에서는
java.time
패키지를 사용하여 날짜와 시간을 다루는 것이
권장됩니다.
1. java.time
패키지 (Java 8 이상 권장)
Java 8부터 도입된 java.time
패키지는 기존
Date
와 Calendar
의 단점을
보완하여 더욱 직관적이고 강력한 기능을 제공합니다.
1.1 현재 날짜 및 시간 가져오기
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
// 현재 날짜
LocalDate date = LocalDate.now();
System.out.println("현재 날짜: " + date);
// 현재 시간
LocalTime time = LocalTime.now();
System.out.println("현재 시간: " + time);
// 현재 날짜 및 시간
LocalDateTime dateTime = LocalDateTime.now();
System.out.println("현재 날짜 및 시간: " + dateTime);
// 특정 타임존의 날짜 및 시간
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
System.out.println("서울 시간: " + zonedDateTime);
}
}
1.2 특정 날짜 및 시간 생성
LocalDate date = LocalDate.of(2024, 3, 4); // 2024년 3월 4일
LocalTime time = LocalTime.of(14, 30, 15); // 14시 30분 15초
LocalDateTime dateTime = LocalDateTime.of(2024, 3, 4, 14, 30, 15);
System.out.println(dateTime);
1.3 날짜 연산 (더하기, 빼기)
LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plusWeeks(1);
LocalDate previousMonth = today.minusMonths(1);
System.out.println("다음 주: " + nextWeek);
System.out.println("지난 달: " + previousMonth);
1.4 날짜 비교
LocalDate date1 = LocalDate.of(2024, 3, 1);
LocalDate date2 = LocalDate.of(2024, 3, 4);
boolean isAfter = date1.isAfter(date2); // false
boolean isBefore = date1.isBefore(date2); // true
boolean isEqual = date1.isEqual(date2); // false
System.out.println("date1이 date2보다 이후인가? " + isAfter);
System.out.println("date1이 date2보다 이전인가? " + isBefore);
System.out.println("date1과 date2가 같은가? " + isEqual);
1.5 날짜 형식 변경 (Formatting & Parsing)
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
// 날짜를 문자열로 변환
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDate = now.format(formatter);
System.out.println("포맷된 날짜: " + formattedDate);
// 문자열을 날짜로 변환
LocalDateTime parsedDate = LocalDateTime.parse("2024-03-04 14:30:00", formatter);
System.out.println("파싱된 날짜: " + parsedDate);
}
}
2. java.util.Date
(Java 8 이전)
과거에는 Date
클래스를 사용하여 날짜 및 시간을
다뤘습니다. 하지만 Date
는 가변성이 있고,
Calendar
없이 직접 연산이 불가능하며,
SimpleDateFormat
을 사용해야 하는 등 단점이 많습니다.
2.1 현재 날짜 및 시간 가져오기
import java.util.Date;
public class Main {
public static void main(String[] args) {
Date now = new Date();
System.out.println("현재 날짜 및 시간: " + now);
}
}
2.2 날짜 포맷 변경 (SimpleDateFormat
)
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
Date now = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = formatter.format(now);
System.out.println("포맷된 날짜: " + formattedDate);
}
}
3. java.util.Calendar
(Java 8 이전)
Calendar
는 Date
의 단점을
보완하기 위해 도입되었지만, 코드가 복잡하고 사용하기 어렵다는 단점이 있습니다.
3.1 현재 날짜 및 시간 가져오기
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; // 0부터 시작하므로 +1 필요
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
System.out.println("현재 날짜 및 시간: " + year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second);
}
}
3.2 날짜 연산
calendar.add(Calendar.DAY_OF_MONTH, 7); // 7일 후
calendar.add(Calendar.MONTH, -1); // 1달 전
4. java.sql.Date
(JDBC)
데이터베이스와 연동할 때 java.sql.Date
를 사용합니다.
이는 java.util.Date
를 상속하지만, 날짜(연-월-일)만
포함하고 시간 정보는 무시합니다.
4.1 java.sql.Date
사용 예시
import java.sql.Date;
public class Main {
public static void main(String[] args) {
long millis = System.currentTimeMillis();
Date sqlDate = new Date(millis);
System.out.println("SQL 날짜: " + sqlDate);
}
}
결론
-
Java 8 이상에서는
java.time
패키지를 사용하는 것이 가장 권장됩니다. -
Java 8 이전에서는
java.util.Date
와java.util.Calendar
를 사용했지만, 복잡성과 가변성 때문에 최신 코드에서는 잘 사용되지 않습니다. -
JDBC와 연동할 때는
java.sql.Date
를 사용합니다.
어떤 걸 사용해야 할까?
✅ 새로운 프로젝트 → java.time
사용
(LocalDate
, LocalTime
,
LocalDateTime
,
ZonedDateTime
)
❌ 구형 코드 유지보수 →
java.util.Date
와 Calendar
를
이해하고 필요할 때 변환
java.sql.Date
사용