Calendar 클래스로 두 시간 사이를 계산할 수 있다. 날짜도 계산할 수 있지만 기본적으로 단위변환을 직접해줘야 한다.
앞서 밀리세컨드(1000분의 1초)로 받은 숫자를 가지고 날짜를 연산할 수 있었다. 두 시간 사이가 얼마나 되는지도 같은 방식으로 구할 수 있다.
우선 두 개의 Calendar 인스턴스가 필요하다. 두개의 시간이 바로 두 개의 객체이다. 자바에서는 사물뿐 아니라 시간이라는 개념도 클래스로 사용할 수 있다.
여러가지 방법으로 시간을 설정할 수 있다. 예제에서는 한번에 설정하는 방식을 선택했다. set 메소드는 년,월,일,시,분,초 의 순서로 매개변수가 들어간다. 날짜는 동일하게 2020년 1월 1일로 맞췄다. 여기서 월이 0인 것을 주의한다. Calendar 클래스는 월이 0부터 시작한다.
두개의 시간을 get 메소드로 JLabel에 표시한다. 이 예제에서는 좀 번거러워도 스윙을 사용한다. System.out.println 이 빠른 실행결과는 좋지만 아무래도 질리기 쉽상이다.
두 시간은 거리는 역시 밀리세컨드로 계산한다. 1,000으로 나누면 초가 된다.
앞쪽에 TIME_UNIT 상수는 시간, 분, 초를 계산하기 위해 만들었다. for 루프문의 알고리즘으로 동작한다.
A와 B 시간의 차이는 47,690초이고 3,600초로 나누면 시간이 나온다. 그리고 나머지 890초를 60초로 나눠서 분을 구하고, 나머지 50초가 나온다. 아래와 같은 연산과정이 담겨있다. dif1=0 까지 보이지 않더라도 실행이 된다.
시간은 중요하므로 프로그램에서도 시간을 잘 다룰 수 있어야 한다. (너무 클리셰이한가 ㅋ)
package com.kay.inter;
import java.awt.Font;
import java.util.Calendar;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class CalendarEX3 extends JFrame{
Font f1;
CalendarEX3(){
final int[] TIME_UNIT = {3600,60,1};
final String[] TIME_UNIT_NAME = {"시간 ","분 ","초"};
f1 = new Font("배달의민족 도현",Font.PLAIN,30);
// today
Calendar date1 = Calendar.getInstance();
date1.set(2020, 0, 1, 10, 20, 30);
// that day
Calendar date2 = Calendar.getInstance();
date2.set(2020, 0, 1, 23, 35, 20);
String str1 = "시간 1: " + date1.get(Calendar.HOUR_OF_DAY) + "시 " + date1.get(Calendar.MINUTE) + "분 " +
date1.get(Calendar.SECOND) + "초 ";
String str2 = "시간 2: " + date2.get(Calendar.HOUR_OF_DAY) + "시 " + date2.get(Calendar.MINUTE) + "분 " +
date2.get(Calendar.SECOND) + "초 ";
long dif1 = (date2.getTimeInMillis() - date1.getTimeInMillis())/1000;
String tmp ="시간 차이 : ";
for (int i=0; i<TIME_UNIT.length; i++) {
tmp += dif1/TIME_UNIT[i] + TIME_UNIT_NAME[i];
dif1 %= TIME_UNIT[i];
}
JLabel lb1 = new JLabel(tmp);
lb1.setBounds(50, 200, 600, 40);
lb1.setFont(f1);
JLabel lb2 = new JLabel(str1);
lb2.setBounds(50, 100, 600, 40);
lb2.setFont(f1);
JLabel lb3 = new JLabel(str2);
lb3.setBounds(50, 150, 600, 40);
lb3.setFont(f1);
// JFrame
add(lb1);add(lb2);add(lb3);
setTitle("Calendar Example");
setSize(700,500);
setLayout(null);
setVisible(true);
}
public static void main(String[] args) {
new CalendarEX3();
}
}