충분히 쌓여가는
Calendar 클래스 본문
java.util.Date
날짜와 시간을 다룰 목적으로 만들어진 클래스
Date의 메서드는 거의 deprecated(더 이상 사용되지 않는) 되었지만, 여전히 쓰이고 있다
java.util.Calendar
Date 클래스를 개선한 새로운 클래스(여전히 단점 존재함)
java.time 패키지
Date와 Calendar의 단점을 개선한 새로운 클래스들을 제공
날짜만 다룰 때: LocalDate
시간만 다룰 때: LocalTime
날짜와 시간 둘 다 다룰 때: LocalDateTime
Calendar 클래스
추상 클래스이므로 getInstance()를 통해 구현된 객체를 얻어야 한다
getInstance()는 변경해야할 수도 있지만, getInstance()를 사용하는 쪽은 변경을 하지 않아도 된다
// Calendar cal = new Calendar(); // 에러, 추상 클래스는 인스턴스 생성 불가
// getInstance() 메서드는 Calendar 클래스를 구현한 클래스의 인스턴스를 반환한다
Calendar cal = Calendar.getInstance();
해당 코드처럼 사용하면되는데 왜 바로 위의 코드와 같이 getInstance()를 통해 구현된 객체를 얻는이유는
달력에 서양력(그래고리), 불교력, 일본력 같이 여러 년도를 표기하는 방식이 있기 때문
// 다른 달력을 사용해야할 때 수정해야하는 불편한 코드
class Myapplication {
public static void main(String args[]) {
Calendar cal = new GregorianCalendar(); // 경우에 따라 이 부분을 변경해야 함
}
}
get()으로 날짜와 시간 필드 가져오기 - int get(int field)
Calendar cal = Calendar.getInstance(); // 현재 날짜와 시간으로 셋팅됨
int thisYear = cal.get(Calendar.YEAR); // 올해가 몇 년인지 알아낸다
int lastDayofMonth = cal.getActualMaximum(Calendar.DATE); // 이 달의 마지막 날
Calendar에 정의된 필드
MONTH: 0이면 1월, 1이면 2월, ...
DAY_OF_WEEK: 1이면 일요일, 2면 월요일, ...
날짜 관련 필드명 | 설명 |
YEAR | 년 |
MONTH | 월(0부터 시작) |
WEEK_OF_YEAR | 1월 1일부터 현재까지의 몇 번째 주 |
WEEK_OF_MONTH | 그 달의 몇 번째 주 |
DATE | 일 |
DAY_OF_YEAR | 1월 1일부터 그 해의 몇 번째 일 |
DAY_OF_MONTH | 1월 1일부터 그 달의 몇 번째 일 |
DAY_OF_WEEK | 요일 |
DAY_OF_WEEK_IN_MONTH | 그 달의 몇 번째 요일 |
시간 관련 필드명 | 설명 |
HOUR | 시간(0~11) |
HOUR_OF_DAY | 시간(0~23) |
MINUTE | 분 |
SECOND | 초 |
MILLISECOND | 천분의 일초 |
ZONE_OFFSET | GMT 기준 시차(천분의 일초 단위) |
AM_PM | 오전/오후 |
코드
2023년 7월 2일 기준
날짜나 시간을 변경하고 싶다면: get 대신 set 사용
import java.util.Calendar;
public class CalendarTest {
public static void main(String[] args) {
Calendar today = Calendar.getInstance();
System.out.println(today.get(Calendar.YEAR)); // 2023
System.out.println(today.get(Calendar.MONTH)); // 6
System.out.println(today.get(Calendar.WEEK_OF_YEAR)); // 27
System.out.println(today.get(Calendar.WEEK_OF_MONTH)); // 2
System.out.println();
System.out.println(today.get(Calendar.DATE)); // 2
System.out.println(today.get(Calendar.DAY_OF_YEAR)); // 183
System.out.println(today.get(Calendar.DAY_OF_MONTH)); // 2
System.out.println(today.get(Calendar.DAY_OF_WEEK)); // 1
System.out.println(today.get(Calendar.DAY_OF_WEEK_IN_MONTH)); // 1
System.out.println(today.get(Calendar.AM_PM)); // 0
System.out.println();
System.out.println(today.get(Calendar.HOUR)); // 9
System.out.println(today.get(Calendar.HOUR_OF_DAY)); // 9
System.out.println(today.get(Calendar.MINUTE)); // 32
System.out.println(today.get(Calendar.SECOND)); // 38
System.out.println(today.get(Calendar.MILLISECOND)); // 353
System.out.println(today.get(Calendar.ZONE_OFFSET)); // 32400000
System.out.println(today.get(Calendar.DATE)); // 2
}
}
2023
6
27
2
2
183
2
1
1
0
9
9
32
38
353
32400000
2
set()으로 날짜와 시간 지정하기
오버로딩 된 여러 종류의 set 메서드 존재
void set(int field, int value)
void set(int year, int month, int date)
void set(int year, int month, int date, int hourOfDay, int minute)
void set(int year, int month, int date, int hourOfDay, int minute, int second)
날짜 지정하는 방법(월[MONTH]이 0부터 시작한다는 점에 주의)
Calendar date1 = Calendar.getInstance();
date1.set(2023, 6, 2); // 2023년 7월 2일(6월 아님)
// date1.set(Calendar.YEAR, 2023);
// date1.set(Calendar.MONTH, 6);
// date1.set(Calendar.DATE, 2);
날짜 계산 코드
import java.util.Calendar;
public class CalendarTest2 {
public static void main(String[] args) {
// 요일은 1부터 시작하기 때문에, DAY_OF_WEEK[0]은 비워둠
final String[] DAY_OF_WEEK = {"", "일", "월", "화", "수", "목", "금", "토"};
Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();
// date1.set(2023, Calendar.JANUARY, 1);와 같이 할 수 있다
date1.set(2023, 0, 1); // date1을 2023년 1월 1일로 날짜를 설정
System.out.println(toString(date1) + DAY_OF_WEEK[date1.get(Calendar.DAY_OF_WEEK)]);
System.out.println(toString(date2) + DAY_OF_WEEK[date2.get(Calendar.DAY_OF_WEEK)]);
// 두 날짜간의 차이를 얻으려면, getTimeInMillis() 천분의 일초 단위로 변환해야한다.
long difference = (date2.getTimeInMillis() - date1.getTimeInMillis())/1000;
System.out.println("그 날(date1)부터 지금(date2)까지 " + difference +"초가 지남");
System.out.println("일(day)로 계산하면 " + difference/(24*60*60) + "일"); // 1일 = 24 * 60 * 60
}
public static String toString(Calendar date) {
return date.get(Calendar.YEAR)+"년 "+ (date.get(Calendar.MONTH)+1) +"월 " + date.get(Calendar.DATE);
}
}
2023년 1월 1일
2023년 7월 2일
그 날(date1)부터 지금(date2)까지 15724800초가 지남
일(day)로 계산하면 182일
시간 지정하는 방법
Calendar time1 = Calendar.getInstance();
// time1을 9시 45분 30초로 설정
time1.set(Calendar.HOUR_OF_DAY, 9);
time1.set(Calendar.MINUTE, 45);
time1.set(Calendar.SECOND, 30);
시간 계산 코드
import java.util.Calendar;
public class CalendarTest3 {
public static void main(String[] args) {
final int[] TIME_UNIT = {3600, 60, 1}; // 큰 단위를 앞에 놓는다.
final String[] TIME_UNIT_NAME = {"시간 ", "분 ", "초 "};
Calendar time1 = Calendar.getInstance();
Calendar time2 = Calendar.getInstance();
time1.set(Calendar.HOUR_OF_DAY, 10); // time1을 10시 20분 30초로 설정
time1.set(Calendar.MINUTE, 20);
time1.set(Calendar.SECOND, 30);
time2.set(Calendar.HOUR_OF_DAY, 20); // time2을 20시 30분 10초로 설정
time2.set(Calendar.MINUTE, 30);
time2.set(Calendar.SECOND, 10);
System.out.println(time1.get(Calendar.HOUR_OF_DAY)+"시 " + time1.get(Calendar.MINUTE)+"분 " + time1.get(Calendar.SECOND)+"초");
System.out.println(time2.get(Calendar.HOUR_OF_DAY)+"시 " + time2.get(Calendar.MINUTE)+"분 " + time2.get(Calendar.SECOND)+"초");
long difference = Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis()) / 1000;
System.out.println("time1과 time2의 차이는 "+ difference +"초 입니다.");
String tmp = "";
for(int i=0; i < TIME_UNIT.length;i++) {
tmp += difference/TIME_UNIT[i] + TIME_UNIT_NAME[i];
// 36580 / 3600 + 시간 = 10
// 36580 % 3600 = 580
// 580 % 60 = 40
difference %= TIME_UNIT[i];
}
System.out.println("시분초로 변환하면 " + tmp + "입니다.");
}
}
10시 20분 30초
20시 30분 10초
time1과 time2의 차이는 36580초 입니다
시분초로 변환하면 10시간 9분 40초 입니다
clear()은 Calendar 객체의 모든 필드를 초기화
Calendar dt = Calendar.getInstance(); // 현재시간
// Sun Jul 2 12:30:02 KST 2023
System.out.println(new Date(dt.getTimeInMillis());
dt.clear(); // 모든 필드를 초기화
// Thu Jan 01 00:00:00 KST 1970
System.out.println(new Date(dt.getTimeInMillis());
clear(int field)는 Calendar 객체의 특정 필드를 초기화
Calendar dt = Calendar.getInstance(); // 현재시간
// Sun Jul 2 12:30:02 KST 2023
System.out.println(new Date(dt.getTimeInMillis());
dt.clear(Calendar.SECOND); // 초를 초기화
dt.clear(Calendar.MINUTE); // 분를 초기화
dt.clear(Calendar.HOUR_OF_DAY); // 시간을 초기화
dt.clear(Calendar.HOUR); // 시간을 초기화
// Thu Jan 01 00:00:00 KST 1970
System.out.println(new Date(dt.getTimeInMillis());
add()는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향 O)
Calendar date = Calendar.getInstance();
date.clear();
date.set(2023, 7, 30); // 2023년 8월 30일로 설정
date.add(Calendar.DATE, 1); // 날짜(DATE)에 1을 더한다 => 9월 1일
date.add(Calendar.MONTH, -8); // 월(MONTH)에서 8을 뺀다 => 1월 1일
roll()은 특정필드의 값을 증가 또는 감소(다른 필드에 영향 X)
Calendar date = Calendar.getInstance();
date.clear();
date.set(2023, 7, 30); // 2023년 8월 30일로 설정
// add와 달리 roll()은 다른 필드에 영향을 미치지 않는다
date.roll(Calendar.DATE, 1); // 날짜(DATE)에 1을 더한다 => 8월 1일
date.set(2023, 7, 30); // 2023년 8월 30일로 설정
date.roll(Calendar.MONTH, -8); // 월(MONTH)에서 8을 뺀다 => 2023년 12월 30일
코드
import java.util.Calendar;
import static java.util.Calendar.DAY_OF_WEEK;
public class CalendarTest4 {
public static void main(String[] args) {
Calendar date = Calendar.getInstance();
date.set(2023, 7, 31); // 2023년 8월 31일 세팅
System.out.println(toString(date)); // 2023년 8월 31일
System.out.println();
System.out.println("= 1일 후 =");
date.add(Calendar.DATE, 1);
System.out.println(toString(date)); // 2023년 9월 1일
System.out.println("-------------------------");
date.set(2023, 7, 31); // 2023년 8월 31일 세팅
date.roll(Calendar.DATE, 1);
System.out.println(toString(date)); // 2023년 8월 1일
System.out.println();
date.set(2023, 8, 1); // 2023년 9월 1일 세팅
System.out.println("= 9달 전 =");
date.add(Calendar.MONTH, -9);
System.out.println(toString(date)); // 2022년 12월 1일
System.out.println("-------------------------");
date.set(2023, 8, 1); // 2023년 9월 1일 세팅
System.out.println("= 9달 전 =");
date.roll(Calendar.MONTH, -9);
System.out.println(toString(date)); // 2022년 12월 1일
System.out.println();
}
public static String toString(Calendar date) {
return date.get(Calendar.YEAR)+"년 "+ (date.get(Calendar.MONTH)+1)
+"월 " + date.get(Calendar.DATE) + "일";
}
}
2023년 8월 31일
= 1일 후 =
2023년 9월 1일
-------------------------
2023년 8월 1일
= 9달 전 =
2022년 12월 1일
-------------------------
= 9달 전 =
2023년 12월 1일
달력 출력
import java.util.Calendar;
public class CalendarTest5 {
public static void main(String[] args) {
if(args.length !=2) {
System.out.println("Usage : java Ex10_5 2023 7");
return;
}
int year = Integer.parseInt(args[0]);
int month = Integer.parseInt(args[1]);
int START_DAY_OF_WEEK = 0; // 1일의 요일
int END_DAY = 0;
Calendar sDay = Calendar.getInstance(); // 시작일
Calendar eDay = Calendar.getInstance(); // 끝일
sDay.set(year, month-1, 1); // month는 0부터 시작 => -1해주기
eDay.set(year, month, 1);
// 다음달의 첫날(12월 1일)에서 하루를 빼면 현재달의 마지막 날(11월 30일)이 된다.
eDay.add(Calendar.DATE, -1);
// 첫 번째 요일이 무슨 요일인지 알아낸다.
START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
// eDay에 지정된 날짜를 얻어온다.
END_DAY = eDay.get(Calendar.DATE);
// System.out.println(" " + args[0] +"년 " + args[1] +"월");
System.out.println(" " + year +"년 " + month +"월");
System.out.println(" SU MO TU WE TH FR SA");
// 해당 월의 1일이 어느 요일인지에 따라서 공백을 출력한다.
// 만일 1일이 수요일이라면 공백을 세 번 찍는다.(일요일부터 시작)
for(int i=1; i < START_DAY_OF_WEEK; i++)
System.out.print(" ");
for(int i=1, n=START_DAY_OF_WEEK ; i <= END_DAY; i++, n++) {
System.out.print((i < 10)? " "+i : " "+i );
if(n%7==0) System.out.println();
}
}
}
2023년 7월
SU MO TU WE TH FR SA
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Date와 Calendar간의 변환
Date의 메서드는 대부분 deprecated(더 이상 사용되지 않는) 되었지만 여전히 사용한다
1. Calendar를 Date로 변환
Calendar cal = Calendar.getInstance();
...
Date d = new Date(cal.getTimeInMillis()); // Date(long date)
2. Date를 Calendar로 변환
Date d = new Date();
...
Calendar cal = Calendar.getInstance();
cal.setTime(d)
'Java > JAVA2' 카테고리의 다른 글
SimpleDateFormat (0) | 2023.07.04 |
---|---|
형식화 클래스 (0) | 2023.07.03 |
오토박싱 & 언박싱 (0) | 2023.06.29 |
래퍼(wrapper) 클래스, Number 클래스 (0) | 2023.06.29 |
StringBuilder, Math 클래스 (0) | 2023.06.28 |