Calendar 의 두번째 예제다. 이번에는 요일을 숫자에서 한글로 매치시키는 것과 두 날짜간의 연산을 해보겠다.
날짜간의 연산은 MS의 엑셀에도 들어있다. 자바 프로그래밍을 다루게 되면 그보다 더 많은 연산을 할 수 있다.
우선 일,월,화,수,목,금,토를 배열로 저장한다. dayKor[1] = '일' 이런 식으로 저장되면 Calendar 클래스의 get(Calendar.DAY_OF_WEEK] 으로 나온 숫자와 매치가 된다. 일요일부터 토요일까지 1부터 7까지다.
Calendar 형 인스턴스를 2개를 만들면 두 날짜간 연산을 할 수 있다. 그런데 둘이 날짜가 같으니까 한쪽을 다른 날짜로 바꿔줘야 한다. 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