JDK 1.0 : Date 클래스 -> 너무 오래된 방식이라 거의 사용 안함(소멸예정)
JDK 1.1 : Calendar 클래스 -> o
JDK 1.8 : java.time 패키지 + 클래스 -> o
시간
시각
시간과 시각은 연산의 대상이 된다. (피연산자의 자격이 있다.) -> 산술 연산, 비교 연산
시각 + 시각 -> 2021.04.27 09:40 + 2021.04.08 12:30 = X (한달은 몇진법?)
시각 - 시각 -> 2021.04.18 - 2021.04.17 = O (1일) //ex) 개강일 - 종강일 = 수업일수
시각 * 시각 -> X
시각 / 시각 -> X
시각 % 시각 -> X
시간 + 시간 -> 2시간 + 3시간 = O
시간 - 시간 -> 3시간 - 2시간 = O
시간 * 시간 -> X
시간 / 시간 -> X
시간 % 시간 -> X
시각 + 시간 -> 2021.04.27 09:40 + 1시간 = 시각
시각 - 시간 -> 2021.04.27 09:40 - 1시간 = 시각
public class Ex19_DateTime {
public static void main(String[] args) {
//Date 클래스
//현재 시스템의 시간이 now라는 변수에 담긴다.
Date now = new Date();
System.out.println(now);
System.out.println(now.getHours());
System.out.println(now.getMinutes());
}
}
/*결과
java.util.GregorianCalendar[time=1617756411148,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Seoul",offset=32400000,dstSavings=0,useDaylight=false,transitions=30,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2021,MONTH=3,WEEK_OF_YEAR=15,WEEK_OF_MONTH=2,DAY_OF_MONTH=7,DAY_OF_YEAR=97,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=9,HOUR_OF_DAY=9,MINUTE=46,SECOND=51,MILLISECOND=148,ZONE_OFFSET=32400000,DST_OFFSET=0]
*/
Calendar now = Calendar.getInstance();
System.out.println(now);
Calendar now = Calendar.getInstance();
//상수 사용
//1,2,3,4,4가 가리키는 값이 무엇을 가르키는지 알 수 없음.
System.out.println(now.get(1)); //?
System.out.println(now.get(2)); //3
System.out.println(now.get(3)); //15
System.out.println("신길동"); //-> 사람이름?
//상수와 변수의 역할차이
//1. 변수(변경가능), 상수(변경불가능)
//2.변수 (의미o), 상수(의미x)
//변수 사용
int year = 1;
System.out.println(now.get(1)); //상수 직접 사용
System.out.println(now.get(year)); //변수 사용
//상수를 직접 사용하지 말자!!! -> 반드시 변수에 담아서 사용하자!! -> 가독성
System.out.println(20); //상수사용
int age = 20;
System.out.println(age); //변수사용
Calendar now = Calendar.getInstance();
//now.get(원하는 항목 번호)
//int year = 1;
//다 같은 year을 출력한다.
System.out.println(Calendar.YEAR);
System.out.println(now.get(1));
System.out.println(now.get(year));
System.out.println(now.get(Calendar.YEAR)); //o 권장 (어떤 맥락인지 파악하기 좋음.)
주의 시작 -> 일 or 월
우리나라 주의 시작 : 월
ISO -> 주의 시작 : 월
해당 월의 첫 주는 -> 목요일 포함 유무 -> 목요일이 포함되면 첫 주로 인정
//Calendar.YEAR : Calendar 상수
System.out.println(now.get(Calendar.YEAR)); //년. 2021
System.out.println(now.get(Calendar.MONTH)); //월. 3 -> 1월(0)~12월(11)★
System.out.println(now.get(Calendar.DATE)); //일 7
System.out.println(now.get(Calendar.HOUR)); //시 -> 12H
System.out.println(now.get(Calendar.MINUTE)); //분
System.out.println(now.get(Calendar.SECOND)); //초
System.out.println(now.get(Calendar.MILLISECOND)); //밀리초(1/1000초)
System.out.println(now.get(Calendar.AM_PM)); //오전일땐 0 오후일떈 1
System.out.println(now.get(Calendar.DAY_OF_MONTH)); //한달에 있어서 몇일?(=Date)
System.out.println(now.get(Calendar.DAY_OF_WEEK)); //이번주 들어서 며칠?( =요일) 일(1)~ 토(7)
System.out.println(now.get(Calendar.DAY_OF_YEAR)); //올해 들어서 몇번째일?
System.out.println(now.get(Calendar.HOUR_OF_DAY)); //시 -> 24H ★
System.out.println(now.get(Calendar.WEEK_OF_YEAR)); //몇주차?
//요구사항) 오늘은 '2021년 4월 7일입니다.'문장 출력
now = Calendar.getInstance(); //변수 초기화, 현재 시간
System.out.printf("오늘은 '%d년 %d월 %d일입니다.'\n"
, now.get(Calendar.YEAR)
, now.get(Calendar.MONTH) + 1 //1월(0)~12월(11)★
, now.get(Calendar.DATE));
//내 생일 : 1995년 5월 12일 15시 30분 50초
Calendar birthday = Calendar.getInstance();
//System.out.println(birthday); // -> 현재시간 출력
//어떤 시각을 만들려면 현재 시각을 만든 뒤 원하는 시각으로 수정해서 사용해야한다.
//수정 메소드 : obj.set()
//void set(int, int)
//void set(int, int, int)
//void set(int, int, int, int, int, int)
//값이 년도인지, 월인지, 일인지 항목을 앞에 써주면 뜻이 명확해짐.
birthday.set(Calendar.YEAR, 1995);
birthday.set(Calendar.MONTH, 4); //5월을 쓰려면 -1을 해준다.★
birthday.set(Calendar.DATE, 12);
//System.out.println(birthday); -> 너무 복잡한 값이 출력(보기 어려움.)
//void set(int, int)사용
//몇년 몇월 몇일인지 명확하지만, 일일히 println하면 코드쓰기 불편.
System.out.println(birthday.get(Calendar.YEAR));
System.out.println(birthday.get(Calendar.MONTH));
System.out.println(birthday.get(Calendar.DATE));
//printf() -> %s, %d, %c, %d, %f + 날짜 시간 형식문자
System.out.printf("%tF\n", birthday); //1995-05-12 (연월일) -> +1안해도 됨 자동으로 해줌
System.out.printf("%tT\n", birthday); //10:40:50 시분초는 아직 안바꿔서 현재시간임. (시분초)
//내 생일 : 1995년 5월 12일 15시 30분 50초
//특정한 시분초 바꾸기
birthday.set(Calendar.HOUR, 15); //12h기준
birthday.set(Calendar.HOUR_OF_DAY, 15); //24h기준 -> ★권장
birthday.set(Calendar.MINUTE, 30);
birthday.set(Calendar.SECOND, 50);
System.out.printf("%tT\n", birthday);
//수료날짜(2021-09-02 18:00:00)
Calendar endDay = Calendar.getInstance();
//이 방식으로 년월일시분초를 다 수정하려면 코드가 길어짐.
//endDay.set(Calendar.YEAR, 2021);
//endDay.set(Calendar.DATE, 8);
//void set(int, int, int) 사용 -> 3줄을 한줄로 쓸 수 있어서 간단해짐.
endDay.set(2021, 8, 2);
//오버로딩은 인자의 갯수와 자료형이 같으면 같은 메소드로 취급 -> 그래서 시분초는 따로 사용할 수 없음.
//endDay.set(18, 0, 0);
//void set(int, int, int, int, int, int)사용 (년월일시분초를 한번에 바꿀 수 있음.)
endDay.set(2021, 8, 2, 18, 0, 0);
System.out.printf("%tF %tT\n", endDay, endDay); //2021-09-02 18:00:00
Calendar now = Calendar.getInstance();
//System.out.printf("%tF\n", now); -> 현재시각 2021-04-07
//현재시각으로 부터 +100일
//add() : 원본을 수정하는 메서드 -> ★주의!!
now.add(Calendar.DATE, 100);
System.out.printf("%tF\n", now); // add()후 -> 2021-07-16으로 원본이 수정됨.
//현재시각 + 200일
now.add(Calendar.DATE, 100); // -> 앞에 add()를 사용해서 이미 100일 뒤가 원본이 됨.
//now.add(Calendar.DATE, 200); -> 그래서 200을 쓰면 300일이 + 됨.
System.out.printf("%tF\n", now);
//초기화 - 다시 현재 시각
now = Calendar.getInstance();
//사귄지 125일이 되었음, 만났었던 날을 구하고 싶다.(과거) -> 125일전
now.add(Calendar.DATE, -125); //-를 사용해서 125일전
System.out.printf("%tF\n", now);
//지금으로부터 4시간뒤를 구하기
now = Calendar.getInstance(); //초기화
now.add(Calendar.HOUR_OF_DAY, 4); //시간을 더함
now.add(Calendar.MINUTE, 30); //분을 더함
System.out.printf("%tF\n", now); //출력
//내가 태어난지 며칠째인지?
//1995년 5월 12일 3시 30분 50초
Calendar now = Calendar.getInstance(); //현재 시각
Calendar birthday = Calendar.getInstance();//태어난 시각
birthday.set(1995, 4, 12, 15, 30, 50); //내 생일로 수정
//에러 : The operator - is undefined for the argument type(s) java.util.Calendar, java.util.Calendar
//산술연산자 -> 피연산자는 원시형밖에 가질 수 없다.(특히 숫자형만 가능)
//System.out.println(now - birthday); -> 참조형은 피연산자가 될 수 없다.
//2021-04-07 11:19:00(현재 시각) - 1995-04-12 15:30:50(내가 태어난 시각) -> 날짜를 뺄 수 없다. => 초로 환산해서 연산한다.
//기준점(기준시각) : 1970-01-01 00:00:00 또는 01-01-01 00:00:00
//기준점 ~ 특정 시각까지의 누적 시간 -> tick값, ephoch time(유닉스 시간)
// 기준점(1970-01-01 00:00:00)으로 부터 현재 시간까지 몇 milliseconds인지 구해줌.
//System.out.println(now.getTimeInMillis());
//System.out.println(now.getTimeInMillis()/ 1000(초) / 60(분) / 60(시) / 24(일)); -> 나누기로 초에서 일로 환산하기
//숫자가 커서 int로 받을 수 없다.
long nowTick = now.getTimeInMillis();
long birthTick = birthday.getTimeInMillis();
//시간 : 초, 분, 시, 일(부분 허용), 월(x), 년(x)
System.out.println((nowTick - birthTick) / 1000 / 60 / 60 / 24);
//올해 크리스마스가 몇일이 남았을까요?
Calendar now = Calendar.getInstance();
Calendar christmas = Calendar.getInstance();
christmas.set(2021,11,25,0,0,0);
long nowTick = now.getTimeInMillis();
long christmasTick = christmas.getTimeInMillis();
System.out.printf("올해 크리스마스는 %d일 남았습니다.\n", (christmasTick - nowTick) / 1000 / 60 / 60 / 24);
//2시간 30분 -> 데이터
//시간을 다룰땐 Calendar을 사용할 수 없다.(Calendar은 시각을 다룸.) -> 잘못된 방법!!
//Calendar c1 = Calendar.getInstance();
//c1.set(Calendar.HOUR_OF_DAY, 2);
//c1.set(Calendar.MINUTE, 30);
//System.out.printf("%fF %tT\n", c1, c1); -> 시각임.
//2시간 30분(시간) -> 숫자로 보고 계산한다.
int hour = 2;
int min = 30;
//2시간 30분 + 20분 = 2시간 50분
//시간 + 시간 = 시간
min = min + 20;
System.out.printf("%d시간 %d분\n", hour, min);
//2시간 50분 + 30분 => 2시간 80분 => 3시간 20분
min = min + 30;
System.out.printf("%d시간 %d분\n", hour,min);
hour += min / 60; //60으로 나누고 몫을 반올림.
min = min % 60; //반올림이 되고 난 나머지값
System.out.printf("%d시간 %d분\n", hour,min);