1. java.util.Date 클래스
1.1 개요
- 특정 시점의 날짜와 시간을 표현하는 클래스
- 1970년 1월 1일 00:00:00 GMT (에포크 타임)부터의 밀리초를 기준으로 함
- 대부분의 메서드가 deprecated 되었으며, Calendar나 LocalDateTime 사용 권장
1.2 주요 생성자
Date date1 = new Date();
Date date2 = new Date(1234567890000L);
1.3 주요 메서드
Date date = new Date();
long time = date.getTime();
date.setTime(1234567890000L);
Date date1 = new Date();
Date date2 = new Date();
boolean isAfter = date1.after(date2);
boolean isBefore = date1.before(date2);
int compareResult = date1.compareTo(date2);
String dateString = date.toString();
2. java.util.Calendar 클래스
2.1 개요
- Date 클래스의 한계를 보완하기 위해 도입
- 추상 클래스이며, getInstance()로 구현체 얻음
- 시간대(TimeZone) 지원
- 날짜와 시간 필드 개별 조작 가능
2.2 Calendar 생성
Calendar cal = Calendar.getInstance();
Calendar calNY = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
Calendar cal2 = Calendar.getInstance();
cal2.set(2024, Calendar.OCTOBER, 23);
2.3 날짜/시간 필드 다루기
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
int millisecond = cal.get(Calendar.MILLISECOND);
cal.set(Calendar.YEAR, 2024);
cal.set(Calendar.MONTH, Calendar.OCTOBER);
cal.set(Calendar.DAY_OF_MONTH, 23);
cal.set(2024, Calendar.OCTOBER, 23, 14, 30, 0);
cal.add(Calendar.DAY_OF_MONTH, 5);
cal.add(Calendar.MONTH, -2);
cal.roll(Calendar.DAY_OF_MONTH, 10);
2.4 Date와 Calendar 변환
Calendar cal = Calendar.getInstance();
Date date = cal.getTime();
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
2.5 날짜 비교
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal2.add(Calendar.DAY_OF_MONTH, 1);
boolean isAfter = cal1.after(cal2);
boolean isBefore = cal1.before(cal2);
int compareResult = cal1.compareTo(cal2);
long diffMillis = cal2.getTimeInMillis() - cal1.getTimeInMillis();
long diffDays = diffMillis / (24 * 60 * 60 * 1000);
3. 날짜/시간 포맷팅
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formatDate = sdf.format(date);
try {
Date parsedDate = sdf.parse("2024-10-23 14:30:00");
} catch (ParseException e) {
e.printStackTrace();
}
3.2 주요 포맷 패턴
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy년 MM월 dd일");
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf4 = new SimpleDateFormat("E요일");
SimpleDateFormat sdf5 = new SimpleDateFormat("yyyy.MM.dd a hh:mm");
4. 실용적인 사용 예제
4.1 특정 기간 날짜 리스트 생성
public static List<Date> getDatesBetween(Date startDate, Date endDate) {
List<Date> dates = new ArrayList<>();
Calendar cal = Calendar.getInstance();
cal.setTime(startDate);
while (!cal.getTime().after(endDate)) {
dates.add(cal.getTime());
cal.add(Calendar.DATE, 1);
}
return dates;
}
4.2 나이 계산
public static int calculateAge(Date birthDate) {
Calendar birth = Calendar.getInstance();
birth.setTime(birthDate);
Calendar today = Calendar.getInstance();
int age = today.get(Calendar.YEAR) - birth.get(Calendar.YEAR);
if (today.get(Calendar.DAY_OF_YEAR) < birth.get(Calendar.DAY_OF_YEAR)) {
age--;
}
return age;
}
4.3 날짜 차이 계산
public static long getDaysBetween(Date start, Date end) {
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(start);
cal2.setTime(end);
cal1.set(Calendar.HOUR_OF_DAY, 0);
cal1.set(Calendar.MINUTE, 0);
cal1.set(Calendar.SECOND, 0);
cal2.set(Calendar.HOUR_OF_DAY, 0);
cal2.set(Calendar.MINUTE, 0);
cal2.set(Calendar.SECOND, 0);
return (cal2.getTimeInMillis() - cal1.getTimeInMillis()) / (1000 * 60 * 60 * 24);
}
5. 주의사항
- Date 클래스의 대부분 메서드는 deprecated
- Calendar의 월(Month)은 0부터 시작 (0: 1월, 11: 12월)
- SimpleDateFormat은 스레드 안전하지 않음
- 최신 Java에서는 java.time 패키지 사용 권장
- 시간대 처리 시 주의 필요
6. 권장사항
- 가능하면 java.time 패키지 사용 (Java 8 이상)
- SimpleDateFormat 인스턴스는 재사용하지 말 것
- 날짜 연산 시 Calendar 클래스 활용
- 시간대 관련 처리 시 항상 TimeZone 고려