자바에서 날짜와 시간을 다루기 위한 클래스입니다. 이 클래스는 자바의 초기 버전부터 존재해 왔으며, 날짜와 시간을 표현하고 조작하는 기본적인 기능을 제공합니다.
Date
클래스의 기본 개념Date
클래스는 날짜와 시간을 표현하는 클래스로, 날짜와 시간을 밀리초 단위로 저장합니다.
1970년 1월 1일 00:00:00 GMT
를 기준으로 한 밀리초 경과 시간을 저장합니다. 이를 "Epoch Time" 또는 "Unix Time"라고 부릅니다.Date
객체 생성 방법Date
객체를 생성하면 현재 시스템의 날짜와 시간을 반환합니다.
import java.util.Date;
public class Main {
public static void main(String[] args) {
Date currentDate = new Date(); // 현재 날짜와 시간
System.out.println(currentDate);
}
}
밀리초 단위로 1970년 1월 1일 00:00:00 GMT를 기준으로 한 시간 값을 인자로 받아 특정 날짜를 생성할 수도 있습니다.
// 생성
Date date3 = new Date(2024-1900, 10-1, 0);
// date를 0으로 주게 된다면? 이전 달의 마지막 날이 출력
System.out.println(date3.toLocaleString());
Date
클래스의 주요 메서드1) getTime()
* 현재 시간을 밀리초 단위로 반환합니다. 이는 Epoch Time을 기준으로 현재까지 경과한 시간을 반환합니다.
Date currentDate = new Date();
long timeInMillis = currentDate.getTime(); // 현재 시간의 밀리초
System.out.println(timeInMillis);
Date
클래스 사용 시 주의점Date
클래스는 시간이 지나면서 설계의 문제점과 API의 혼란으로 인해 몇 가지 단점이 있습니다.
getMonth()
메서드는 0부터 11까지의 값을 반환하여, 0은 1월, 11은 12월을 나타냅니다. 이것은 사용자가 혼란스러워할 수 있습니다.getYear()
메서드는 1900년을 기준으로 한 연도를 반환합니다. 예를 들어, getYear()
가 121을 반환하면 이는 2021년을 의미합니다.Date
클래스는 불변하지 않음: Date
객체는 변경 가능(mutable)하므로, 동일한 객체를 여러 곳에서 참조할 경우 문제가 발생할 수 있습니다.Date
클래스는 시간대를 다루는 기능이 부족합니다.<수업코드>
package com.util1;
import java.util.Date;
public class DateEx01 {
public static void main(String[] args) {
// Date 객체 생성
java.util.Date date1 = new java.util.Date();
// toString()이 오버라이딩 됨
System.out.println(date1);
System.out.println(date1.toString());
// 현재 날짜 시간을 표시
Date date2 = new Date();
System.out.println("date2 = " + date2);
System.out.println(date2.toLocaleString()); // 지역
String strDate = date2.toLocaleString();
System.out.println(strDate);
// [문제] Date 클래스 문자열에서 연, 월, 일을 분리해서 출력해보세요
System.out.println( strDate.substring(0, 4));
System.out.println( strDate.substring(6, 8));
System.out.println( strDate.substring(10, 12));
System.out.println( date2.getYear() + 1900 ); // 연도 : 1900년을 기준으로 한 연도를 반환
System.out.println( date2.getMonth() + 1 ); // 월 : 0부터 11까지의 값을 반환
System.out.println( date2.getDate()); // 일
System.out.println( date2.getDay()); // 요일 (0 : 일요일)
System.out.println( date2.getTime()); // 현재 시간을 밀리초 단위로 반환합니다. 이는 Epoch Time을 기준
System.out.println( System.currentTimeMillis()); // 위와 같음
// 생성
Date date3 = new Date(2024-1900, 10-1, 0);
// date를 0으로 주게 된다면? 이전 달의 마지막 날이 출력
System.out.println(date3.toLocaleString());
}
}
java.util.Calendar
클래스Calendar
클래스의 기본 개념getInstance()
메서드를 사용하여 하위 클래스의 인스턴스를 얻습니다.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); // 월 가져오기 (0부터 시작)
int day = calendar.get(Calendar.DAY_OF_MONTH); // 일 가져오기
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 시간 가져오기 (24시간 형식)
int minute = calendar.get(Calendar.MINUTE); // 분 가져오기
System.out.println("Year: " + year);
System.out.println("Month: " + (month + 1)); // 월은 0부터 시작하므로 1을 더해줌
System.out.println("Day: " + day);
System.out.println("Hour: " + hour);
System.out.println("Minute: " + minute);
}
}
Calendar
의 상수 필드Calendar
클래스는 날짜와 시간을 상수 필드로 정의해 놓고 있습니다. 예를 들어, 연도, 월, 일, 시간, 분, 초와 관련된 상수들을 제공합니다.
Calendar.YEAR
: 연도Calendar.MONTH
: 월 (0 ~ 11: 0 = 1월, 11 = 12월)Calendar.DAY_OF_MONTH
: 일Calendar.HOUR
: 12시간 형식의 시간Calendar.HOUR_OF_DAY:
24시간 형식의 시간Calendar.MINUTE
: 분Calendar.SECOND
: 초Calendar.MILLISECOND
: 밀리초Calendar
객체는 특정 날짜나 시간으로 설정할 수 있습니다. set()
메서드를 사용해 연도, 월, 일 등을 직접 설정합니다.
set(int field, int value)
: 특정 필드를 설정합니다. 예를 들어, 연도, 월, 일, 시간을 설정할 수 있습니다.**Calendar.MONTH**
는 0부터 시작하므로, 12월은 Calendar.DECEMBER
또는 11로 설정해야 합니다.날짜나 시간을 더하거나 빼는 기능은 add()
메서드를 통해 제공합니다.
add(int field, int amount)
: 특정 필드에 값을 더하거나 뺍니다. 음수를 전달하면 해당 값만큼 감소합니다.import java.util.Calendar;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
// 날짜를 2024년 12월 25일로 설정
calendar.set(Calendar.YEAR, 2024);
calendar.set(Calendar.MONTH, Calendar.DECEMBER); // 11 = 12월
calendar.set(Calendar.DAY_OF_MONTH, 25);
System.out.println(calendar.getTime()); // 설정된 날짜 출력
}
}
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
// 현재 날짜에서 10일 더하기
calendar.add(Calendar.DAY_OF_MONTH, 10);
System.out.println("10일 후: " + calendar.getTime());
// 현재 날짜에서 2개월 빼기
calendar.add(Calendar.MONTH, -2);
System.out.println("2개월 전: " + calendar.getTime());
}
}
Calendar
객체의 날짜를 비교할 때는 before()
, after()
등의 메서드를 사용할 수 있습니다.
before(Calendar when)
: 해당 날짜가 인자로 전달된 날짜보다 이전인지 확인합니다.after(Calendar when)
: 해당 날짜가 인자로 전달된 날짜보다 이후인지 확인합니다.Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();
// 5일 후 날짜 설정
calendar2.add(Calendar.DAY_OF_MONTH, 5);
System.out.println(calendar1.before(calendar2)); // true (현재 날짜는 5일 후보다 이전)
System.out.println(calendar1.after(calendar2)); // false (현재 날짜는 5일 후보다 이후가 아님)
Calendar
클래스 사용시 주의할 점<수업코드>
package com.util1;
import java.util.Calendar;
public class CalendarEx01 {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH));
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));
// [문제] Calendar 클래스를 활용해서 한글로 요일을 출력해보세요.
String[] weekNames = {"일", "월", "화", "수", "목", "금", "토"};
System.out.println(weekNames[calendar.get(Calendar.DAY_OF_WEEK) - 1]);
System.out.println(calendar.getTimeInMillis());
// 그달의 마지막 날
System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); // 그 달의 마지막 날
System.out.println(calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); // 그 달의 첫 날
}
}
<달력 출력 코드>
package com.util1;
import java.util.Calendar;
public class CalendarEx03 {
public static void main(String[] args) {
int year = 2024;
int month = 10; // 10월
Calendar startCal = Calendar.getInstance();
// 1일 정보
startCal.set(year, month - 1, 1);
// 마지막 날 정보
int endDate = startCal.getActualMaximum(Calendar.DAY_OF_MONTH);
// 요일
int startDayOfWeek = startCal.get(Calendar.DAY_OF_WEEK);
// 달력 출력
System.out.println(" SU MO TU WE TH FR SA");
for (int i = 1; i < startDayOfWeek; i++) {
System.out.print(" "); // 자릿 수를 위함
}
// i : 달력디자인, n: 날짜
for (int i = 1, n = startDayOfWeek; i <= endDate; i++, n++) {
System.out.print((i < 10) ? " " + i : " " + i);
if (n % 7 == 0) {
System.out.println();
}
}
}
}