학원 8일차 - Java

47755 단어 학원자바자바

2021.04.07

날짜를 다루는 자료형

  • JDK 1.0 : Date 클래스 -> 너무 오래된 방식이라 거의 사용 안함(소멸예정)

  • JDK 1.1 : Calendar 클래스 -> o

  • JDK 1.8 : java.time 패키지 + 클래스 -> o

  • 시간

    • ex) 우리 수업은 8시간입니다. -> 시간 -> 한축의 점과 점사이의 거리(사이)
  • 시각

    • ex) 2021.04.07 09:10 -> 시각 -> 한축의 점
  • 시간과 시각은 연산의 대상이 된다. (피연산자의 자격이 있다.) -> 산술 연산, 비교 연산

시각 + 시각 -> 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시간 = 시각


Date 클래스

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());
        
    }
}

Calendar 클래스

  • 현재 시각 얻어오기(만들기)
/*결과
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 결과에서 원하는 항목을 추출하는 방법
    • int get(int)
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));

Calendar 클래스

  • 특정 시각 만들기(원하는 시간)
    • obj.get() : 읽기 메소드(값을 가져옴)
    • obj.set() : 쓰기 메소드(값을 집어넣을 때 사용 )
//내 생일 : 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

시간연산 - 날짜 시간 연산

  • void add(int, int)
  • 시각 + 시간 / 시각 - 시간
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);

좋은 웹페이지 즐겨찾기