Calendar 의 두번째 예제다. 이번에는 요일을 숫자에서 한글로 매치시키는 것과 두 날짜간의 연산을 해보겠다.

 

날짜간의 연산은 MS의 엑셀에도 들어있다. 자바 프로그래밍을 다루게 되면 그보다 더 많은 연산을 할 수 있다.

 

우선 일,월,화,수,목,금,토를 배열로 저장한다. dayKor[1] = '일' 이런 식으로 저장되면 Calendar 클래스의 get(Calendar.DAY_OF_WEEK] 으로 나온 숫자와 매치가 된다. 일요일부터 토요일까지 1부터 7까지다.

 

Calendar 형 인스턴스를 2개를 만들면 두 날짜간 연산을 할 수 있다. 그런데 둘이 날짜가 같으니까 한쪽을 다른 날짜로 바꿔줘야 한다. set메소드로 날짜를 바꿀 수 있다.

set 메소드

set 메소드를 사용해서 날짜를 분과 초까지 설정가능하다.

 

import java.awt.Font;
import java.util.Calendar;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class CalendarEX2 extends JFrame{
	Font f1;
	
	CalendarEX2(){	
		final String[] dayKor = {"","일","월","화","수","목","금","토"};
		
		f1 = new Font("배달의민족 도현",Font.PLAIN,30);
		
		// today
		Calendar date1 = Calendar.getInstance();
		
		// that day
		Calendar date2 = Calendar.getInstance();
		date2.set(2020, 0, 1, 0, 0, 0);
		
		JLabel lb1 = new JLabel();
		lb1.setBounds(50, 100, 600, 40);
		lb1.setFont(f1);
		
		String t1 ="오늘은 " + date1.get(Calendar.YEAR) + "년 "+ (date1.get(Calendar.MONTH)+1) +
                    " 월 " + date1.get(Calendar.DAY_OF_MONTH) + " 일 " +
				dayKor[date1.get(Calendar.DAY_OF_WEEK)] + "요일입니다";
		
		lb1.setText(t1);
			
		long dif1 = (date1.getTimeInMillis() - date2.getTimeInMillis())/1000; // 초단위 환산
		long day = dif1/(60*60*24); //초를 일로 바꿈
		
		// JTextField
		JTextField tf1 = new JTextField();
		tf1.setBounds(50, 180, 450, 40);
		tf1.setFont(f1);
		String t3 = " 올해도 벌써 " + day + " 일이 지났다";
		tf1.setText(t3);
					
		System.out.println(day);
		
		// JFrame
		add(lb1);add(tf1);
		setTitle("Calendar Example");
		setSize(700,500);
		setLayout(null);
		setVisible(true);
	}

	public static void main(String[] args) {
		
		new CalendarEX2();
	}
}

 

이제 두 날짜 사이에 연산을 할 수 있다. millisecond로 받는다. 밀리세컨드는 1000분의 1초다. 그런데 무슨 숫자를 받는걸까? Javadoc에 의하면 epoch 타임에서 부터 계산된 값이라고 한다. JDK에서 그 설정 시간은 1970년이라고 설정되있다. 즉 1970년부터 오늘까지의 시간을 1000분의 1초로 리턴한다. 오늘이 2020년 7월27일이고 2020년1월1일0시를 기준으로 또 하나의 날짜를 설정한후 서로 빼면 차이가 나온다. 밀리세컨드니까 1000을 나누면 그 값이 18,025,707초이다. 이 숫자를 (60*60*24)로 나누면 며칠이 차이가 나는지 나온다. 208일이라고 나온다.

 

어쨋든 좋다. 날짜의 조작은 생각보다 익숙하지 않을지도 모른다. 시간의 진법인 60진법 12진법, 요일의 7진법 달력의 30진번이 나와서 헷갈리기 때문이다. 진법이 복잡한 건 우리 인생이 소중하기 때문인지도 모른다.

 

시간은 금이라고 한다. 자바JDK에서 시간을 마스터 하는 것은 기본이다.

 

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#Epoch

 

Calendar (Java Platform SE 7 )

Adds or subtracts (up/down) a single unit of time on the given time field without changing larger fields. For example, to roll the current date up by one day, you can achieve it by calling: roll(Calendar.DATE, true). When rolling on the year or Calendar.YE

docs.oracle.com

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band