본문 바로가기

프로그래밍/JAVA

[JAVA] 캘린더(Calendar)


0. Date


Date는 지역화되지 않았다.

  - 나라, 국가, 지역별로 시간, 통화, 언어 등에 대한 고려가 이루어지지 않았다.


Date 클래스는 대부분 Deprecated (더 이상 지원하지 않는 기능으므로 사용 자제하라는 의미) 되었다. 

당장은 compile error가 나지는 않지만, 가급적이면 사용을 자제하고 Calendar를 사용하자.


기본생성자를 사용하면 현재 시간, 날짜 정보를 Date 인스턴스가 갖게 된다.

date 인스턴스 결과값 ☞ Wed Oct 26 19:50:47 KST 2016


이상하게 출력된 값을 내 입맛에 맞게 출력하고 싶다면

SimpleDateFormat 클래스를 이용해야 한다.


SimpleDateFormat 결과값 ☞ 2016.10.26 at 07:50:47 오후 KST

yyyy는 연도, MM은 월(月), dd는 일(日)

hh는 시간, mm은 분, ss는 초를 뜻하며

a는 오전/오후, zzz는 타임존에 해당한다.


1. Calendar


Calendar는 추상클래스이기 때문에 직접 객체(인스턴스)를 생성할 수 없고, 

인스턴스를 생성하려면 Calendar 클래스메서드를 통해 완전히 구현된 클래스의 인스턴스를 얻어야 한다.

이때 사용하는 메서드가 getInstance이다.

Calendar cal = Calendar.getInstance();


월(月)은 0(1월), 1(2월), 2(3월), .... , 11(12월) 이기 떄문에 "출력값 + 1"이 현재 월(月)이다.


시간표현에 대한 기능도 있다.


[ Calendar의 add메서드 ]

※ toString메서드를 오버라이딩 해야 한다.

roll 메서드는 만약 일(日)을 최대 일수인 31일을 넘게 주어도 월(月)은 건드리지 않는다.

그래서 31일 후 출력 결과를 보아도 2016년 3월 3일로 동일하게 된다.


[ 달력 출력하기 ]

위와 같이 출력되도록 코드를 구성한다.

커맨드라인(cmd)에서 입력이 가능하며, 윈도우키+R을 눌러 cmd를 실행시킨다.


[ 복 습 ] 문자열 → 기본형으로 변환할 때 wrapper 클래스의 '타입.parse타입(String s)'의 메서드를 사용한다.


class exercise
{
public static void main(String[] args)
{
if(args.length !=2) {
System.out.println("Usage : java CalendarEx6 2005 9");
return;
}
int year = Integer.parseInt(args[0]);
int month = Integer.parseInt(args[1]);

int START_DAY_OF_WEEK = 0;
int END_DAY = 0;

Calendar sDay = Calendar.getInstance(); // 시작일
Calendar eDay = Calendar.getInstance(); // 끝일

// 월의 경우 0 부터 11까지의 값을 가지므로 1을 빼주어야 한다.
// 예를 들어, 2004년 11월 1일은 sDay.set(2004, 10, 1);과 같이 해줘야 한다.
sDay.set(year, month-1, 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(" 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();
}
}
}


'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA] 배열(array)  (0) 2016.09.03
[jAVA] 랜덤(Random) 클래스  (0) 2016.09.03
[jAVA] 해시맵(HashMap)  (0) 2016.08.31
[JAVA] StringBuilder & StringBuffer, Math, Wrapper 클래스  (0) 2016.08.25
[JAVA] String 클래스  (0) 2016.08.25