코드일기장

[Java] Calendar 예제 본문

Java

[Java] Calendar 예제

won_hyeok2 2022. 3. 3. 23:37

 

 

JAVA의 정석 기초편 예제들

 

 

package weon;
import java.util.Calendar;
public class langTest {
	public static void main(String[] args) {
		final String[] dayOf= {" ","일","월","화","수","목","금","토"};
		Calendar cal1 = Calendar.getInstance();
		Calendar cal2 = Calendar.getInstance();
		cal1.clear();
		cal1.set(2022,0,1);
		
		System.out.println("cal1은"+toString(cal1)+
							""+dayOf[cal1.get(Calendar.DAY_OF_WEEK)]+"요일입니다.");
		System.out.println("cal2은"+toString(cal2)+
							""+dayOf[cal2.get(Calendar.DAY_OF_WEEK)]+"요일입니다.");
		
		long difference=
				(cal2.getTimeInMillis()-cal1.getTimeInMillis())/1000;
			System.out.println("그 날(cal1)부터 지금(cal2)까지"+difference+"지났습니다.");
			System.out.println("날짜로 계산하면"+difference/(24*60*60)+"지났습니다.");
	}
	public static String toString(Calendar date) {
		return date.get(Calendar.YEAR)+"년"+(date.get(Calendar.MONTH)+1)+"월"+date.get(Calendar.DATE)+"일 ";
	}
}

 

cal1은2022년1월1일 토요일입니다.
cal2은2022년3월1일 화요일입니다.
그 날(cal1)부터 지금(cal2)까지5176864지났습니다.
날짜로 계산하면59일 지났습니다.

 

 

String dayOf[] 배열을 요일을 초기화한 배열이다.

Calendar.DAY_OF_WEEK는 일요일 1부터 월2 화3~토7 숫자는 index이다.

 

 

 

 

날짜와 시간을 원하는 값으로 변경하려면 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)

 

 

두 날짜의 시간 차이를 알고 싶다면 getTimeInMillis()를 사용하면 된다.

1/1000초 단위 값을 반환하기 때문에 단위를 초로 바꾸고 싶다면 1000을 나눠야 한다.

 

long difference=(어떤날짜.getTimeInMillis-어떤날짜2.getTimeInMillis())/1000;

 

두 날짜의 시간 차이 값을 다시 며칠 차이인지로 바꾸려면(일단위)

24(시간)*60(분)*60(초)/1000을 하면 된다.

difference변수는 이미 1000으로 나뉘어 있으므로

 

long difference=difference/(24*60*60);

 

 

 

 

 

package weon;

import java.util.Calendar;

public class TimeSe {

	public static void main(String[] args) {
		int[] TIME= {3600,60,1};
		final String[] StringTime= {"시간","분","초"};

		Calendar cal1 = Calendar.getInstance();
		Calendar cal2 = Calendar.getInstance();
		
		cal1.set(Calendar.HOUR_OF_DAY, 10);
		cal1.set(Calendar.MINUTE, 20);
		cal1.set(Calendar.SECOND, 30);
		
		cal2.set(Calendar.HOUR_OF_DAY, 20);
		cal2.set(Calendar.MINUTE, 30);
		cal2.set(Calendar.SECOND, 30);
		
		System.out.println("cal1:"+cal1.get(Calendar.HOUR_OF_DAY)+
							"시간"+cal1.get(Calendar.MINUTE)+"분"+cal1.get(Calendar.SECOND)+"초");
		System.out.println("cal2:"+cal2.get(Calendar.HOUR_OF_DAY)+
				"시간"+cal2.get(Calendar.MINUTE)+"분"+cal2.get(Calendar.SECOND)+"초");

		
		long difference=Math.abs(cal2.getTimeInMillis()-cal1.getTimeInMillis())/1000;
		System.out.println("두 시간의 차이는 "+difference+"초 입니다.");
		String tmp="";
		for(int i=0;i<TIME.length;i++) {
			tmp+=difference/TIME[i]+StringTime[i];
			difference%=TIME[i];
		}
		System.out.println("시분초로 반환하면"+tmp);
	}

}

 

두 개의 시간 데이터로부터 초 단위로 차이를 구한 다음 시분초로 바꿔 출력하는 예제이다.

 

거스름돈 반환하듯 시분초로 바꾸면 된다.

 

final int[] TIME= {3600,60,1};
final String[] StringTime= {"시간","분","초"};
String tmp="";
for(int i=0;i<TIME.length;i++) {
			tmp+=difference/TIME[i]+StringTime[i];
			difference%=TIME[i];
}

 

두 시간 데이터의 시간 차이(s)가 만약 8980초면

 

8980/3600=2

8980%3600=1780

----- 시간은 2시간 남은 초:1780초 -----

1780/60=29

1780%60=40

----- 분은 29분 남은 초:40초 -----

40/1=40

40%1=0

 

 

 

 


 

 

Calendar add() 메서드는 지정한 필드의 값을 원하는 만큼 증가 또는 감소시킬 수 있는 메서드이다.

add메서드를 이용하면 특정 날짜 또는 시간을 기점으로 해서 일정기간 전 후의 날짜 시간을 알아낼 수 있다.

 

Calendar roll() 메서드는 add메서드와 비슷하지만 add메서드와 달리 다른 필드에는 절대 영향을 미치지 않는다.

예를 들어 31일에서 DATE를+1을 할 경우 add메서드는 MONTH도 +1 연산하지만 roll메서드는 MONTH는 건드리지 않는다.

 

 

 

 

add와 roll 예제

더보기
import java.util.Calendar;

public class StringEx {
	public static void main(String[] args) {
		Calendar cal = Calendar.getInstance();

		cal.clear();
		cal.set(2020, 7, 30);
		cal.add(Calendar.DATE, 2);
		System.out.println("==2일 후==");
		System.out.println(toString(cal));

		cal.add(Calendar.MONTH, -2);
		System.out.println("==2달 전==");
		System.out.println(toString(cal));
		
		cal.roll(Calendar.DATE, 31);
		System.out.println("==31일 후(roll)==");
		System.out.println(toString(cal));
		
		cal.add(Calendar.DATE, 31);
		System.out.println("==31일 후(add)==");
		System.out.println(toString(cal));
	}

	public static String toString(Calendar date) {
		return date.get(Calendar.YEAR) + "년" + date.get(Calendar.MONTH) + "월" + date.get(Calendar.DATE) + "일";
	}
}

 

==2일 후==
2020년8월1일
==2달 전==
2020년6월1일
==31일 후(roll)==
2020년6월1일
==31일 후(add)==
2020년7월1일

 

 

 

 

요일 달력 만들기

더보기
package weon;

import java.util.Calendar;

public class StringBaek {

	public static void main(String[] args) {
		if (args.length != 2) {
			System.out.println(">java StringBeak");
			return;
		}

		int year = Integer.parseInt(args[0]);
		int month = Integer.parseInt(args[1]);

		Calendar cal1 = Calendar.getInstance();
		Calendar cal2 = Calendar.getInstance();

		// 시작일과 마지막일 세팅 2022-03-03 기준
		cal1.set(year, month - 1, 1); // 2022-2-1(3월 1일)
		cal2.set(year, month, 1); // 2022-3-1(4월 1일)

		cal2.add(Calendar.DATE, -1); // 2022-3-31일로 차감

		int StartDay = cal1.get(Calendar.DAY_OF_WEEK); // 첫번 째 요일이 무슨 요일인지(2022-3월 기준 3 대입)
		int end = cal2.get(Calendar.DATE); // 31일 대입

		System.out.println("          " + args[0] + "년 " + args[1] + "일");
		System.out.println(" 일   월   화   수   목   금   토");
		for (int i = 1; i < StartDay; i++) { // 처음 요일 시작일 전 요일들을 공백으로 만들기
			System.out.print("    ");
		}

		for (int i = 1, j = StartDay; i <= end; i++, j++) {
			System.out.print((i < 10) ? "   " + i : "  " + i); // 1~9일은 공백 한 칸 더 두 자리수부터 공백 2칸
			if (j % 7 == 0) {
				System.out.println();
			}

		}
	}

}

 

 

 

 

 

 

마지막으로 Date와 Calendar 간의 변환이다.

 

 

1. Calendar를 Date로 변환

Calendar month = Calendar.getInstance();
month.clear();
month.set(Calendar.MONTH, 1);
Date d = new Date(cal.MONTH);

 

 

2. Date를 Calendar로 변환

Date d = new Date();
Calendar Cal = Calendar.getInstance();
Cal.setTime(d);

Date->Calendar는 setTime메서드 이용!

 

 

'Java' 카테고리의 다른 글

[Java] SimpleDateFormat()  (0) 2022.03.06
[Java] 형식화 클래스, DecimalFormat  (0) 2022.03.06
[Java] Calendar 클래스  (0) 2022.02.25
[Java] StringBuffer의 생성자와 메서드  (0) 2022.02.18
[Java] join(), StringJoiner, StringBuffer  (0) 2022.02.17
Comments