JAVA_52_날짜와 시간

charl hi·2021년 9월 12일
0

JAVA

목록 보기
52/53

Date 클래스

  • java.util.Date

Calendar 클래스

  • java.util.Calendar

  • 추상클래스

  • getInstance()를 통해 구현된 객체를 얻어야 한다.
    : ✨✨Calendar cal = Calendar.getInstance();

  • ✨필드 사용하기
    : ✨✨cal.get(int field)
    -> ✨✨cal.get(Calendar.YEAR)

time 패키지

  • java.time패키지


getInstance() 사용

  • 일반적인 객체 생성과 다르다!!

  • ✨✨Calendar cal = Calendar.getInstance();

읽기 : get()

  • ✨✨참조변수.get(Calendar.필드명)

ex10_01

import java.util.Calendar;

public class Ex10_01 {

	public static void main(String[] args) {
		Calendar today = Calendar.getInstance();
		//이런 방식으로 Calendar 객체를 생성한다!!!
		System.out.println("*날짜*");
		System.out.println("이 해의 년도 : "+today.get(Calendar.YEAR));
		System.out.println("이 해의 월(0~11, 0=1월) : "+today.get(Calendar.MONTH));
		System.out.println("이 해의 일 : "+today.get(Calendar.DATE));
		
		System.out.println("이 해의 몇 째 주 : "+today.get(Calendar.WEEK_OF_YEAR));
		System.out.println("이 달의 몇 째 주 : "+today.get(Calendar.WEEK_OF_MONTH));
		
		System.out.println("이 해의 몇 일(DATE와 같다) : "+today.get(Calendar.DAY_OF_YEAR));
		System.out.println("이 달의 몇 일 : "+today.get(Calendar.DAY_OF_MONTH));
		
		System.out.println("요일(1~7, 1=일요일) : "+today.get(Calendar.DAY_OF_WEEK));
		System.out.println("이 달의 몇 째 요일 : "+today.get(Calendar.DAY_OF_WEEK_IN_MONTH));
		
		System.out.println("*시간*");
		System.out.println("오전/오후(0:오전, 1:오후) : "+today.get(Calendar.AM_PM));
		System.out.println("시간(0~11) : "+today.get(Calendar.HOUR));
		System.out.println("시간(0~24) : "+today.get(Calendar.HOUR_OF_DAY));
		System.out.println("분(0~59) : "+today.get(Calendar.MINUTE));
		System.out.println("초(0~59) : "+today.get(Calendar.SECOND));
		System.out.println("1000 분의 1초(0~999) : "+today.get(Calendar.MILLISECOND));
		
		System.out.println("TimeZone(-12~+12) : "+today.get(Calendar.ZONE_OFFSET)/3600000);
		//**천분의 일초 기준이므로 60*60*1000을 나눈다
		System.out.println("이 달의 마지막 날 : "+today.getActualMaximum(Calendar.DATE));
		//**이 달의 마지막 날을 찾는다
		
		

	}

}

*날짜*
이 해의 년도 : 2021
이 해의 월(0~11, 0=1월) : 8
이 해의 일 : 13
이 해의 몇 째 주 : 38
이 달의 몇 째 주 : 3
이 해의 몇 일(DATE와 같다) : 256
이 달의 몇 일 : 13
요일(1~7, 1=일요일) : 2
이 달의 몇 째 요일 : 2
*시간*
오전/오후(0:오전, 1:오후) : 0
시간(0~11) : 0
시간(0~24) : 0
분(0~59) : 25
초(0~59) : 59
1000 분의 1초(0~999) : 115
TimeZone(-12~+12) : 9
이 달의 마지막 날 : 30


변경 : set()

✨✨clear()

  • 모든 필드를 초기화

  • 참조변수명.clear();

  • 반드시 set() 전에 사용해야함!!!!

  • set()은 완전히 똑같은 객체가 아니기 때문에 ms(1000분의 1초)에 차이가 날 수 있기 때문?


날짜 지정하기 : 년, 월, 일

  • 한번에 : ✨참조변수명.set(연, 월, 일);

  • 나눠서

    • 참조변수명.set(Calendar.YEAR, 연);
    • 참조변수명.set(Calendar.MONTH, 월);
      • 0~11, 0=1월 조심!
    • 참조변수명.set(Calendar.DATE, 일);

시간 지정하기 : 시, 분, 초

  • 한번에는 못함!! 나눠서!!
    • 참조변수명.set(Calendar.HOUR_OF_DAY, 시);
    • 참조변수명.set(Calendar.MINUTE, 분);
    • 참조변수명.set(Calendar.SECOND, 초);


시간 차이 구하기

long 변수 = 
Math.abs(참조변수1.getTimeInMillis() - 참조변수2.getTimeInMillis()) / 1000;
  • long 변수 : Math.abs(long) 반환타입과 맞추기 위해
  • Math.abs : 절대값 구하기
  • getTimeInMillis() : ms로 변환해서 연산
  • / 1000 : 1000배 많아진 것이기에 1000으로 나눔

초 -> 시분초 바꾸기

  • 거스름돈 동전 개수 구하기와 같은 방식이다.
final int[] TIME_UNIT = {3600, 60, 1};
final String[] TIME_UNIT_NAME = {"시간 ", "분 ", "초"};
	//...
        //...
String tmp = "";	//***빈문자열
for(int i=0; i<TIME_UNIT.length; i++) {
	tmp += difference/TIME_UNIT[i] + TIME_UNIT_NAME[i];
		//+= 인거 ***
	difference %= TIME_UNIT[i];
		//다음걸 %= ****
}
  • int[] : 3600(=60 * 60), 60, 1 을 담을 int 배열 만들기
  • /3600 : 시
  • /60 : 분
  • /1 : 초
  • String tmp : 문자열 결합을 위해?
  • % : 시->분->초 작은 단위로 넘어갈 때

ex10_02

import java.util.*;

class Ex10_02 {

	public static void main(String[] args) {
		
		final String[] Day_OF_Week= {"", "일", "월", "화", "수", "목", "금", "토"};
		//요일은 1부터 시작하기에, 0은 빈문자열로
		//변수의 상수화를 위해 final
		
		Calendar date1 = Calendar.getInstance();
		Calendar date2 = Calendar.getInstance();
		
		//2020년 4월 29일
		//3대신 Calendar.APRIL 해도 됨!
		date1.set(2020, 3, 29);
		System.out.println("date1은 "+ toString(date1)+ Day_OF_Week[date1.get(Calendar.DAY_OF_WEEK)]+"요일이다.");
		
		System.out.println("date2는 "+ toString(date2)+ Day_OF_Week[date2.get(Calendar.DAY_OF_WEEK)]+"요일이다.");
		
		//두 날짜 간의 차이
		long difference = Math.abs(date1.getTimeInMillis() - date2.getTimeInMillis()) / 1000;
		
		
		System.out.println("그날(date1)부터 지금(date)2까지 "+difference+"초가 지났습니다.");
		System.out.println("일(day)로 계산하면"+ difference/(60*60*24)+"일입니다.");
		
		
	}
	
	//toString 오버라이딩			
	public static String toString(Calendar date) {
		return date.get(Calendar.YEAR)+"년 ";
	}	
	//왜 에러가 나는지 알았다. 메인메소드 안에 있으니까 그렇지 이 바보야!!!!
}

date1은 2020년 수요일이다.
date2는 2021년 화요일이다.
그날(date1)부터 지금(date)2까지 43459200초가 지났습니다.
일(day)로 계산하면503일입니다.


ex10_03

import java.util.Calendar;

public class Ex10_03 {

	public static void main(String[] args) {
		final int[] TIME_UNIT = {3600, 60, 1};
		final String[] TIME_UNIT_NAME = {"시간 ", "분 ", "초"};
		
		Calendar time1 = Calendar.getInstance();
		Calendar time2 = Calendar.getInstance();
		
		time1.clear();
		time2.clear();
		
		time1.set(Calendar.HOUR_OF_DAY, 10);
		time1.set(Calendar.MINUTE, 20);
		time1.set(Calendar.SECOND, 40);
		
		time2.set(Calendar.HOUR_OF_DAY, 20);
		time2.set(Calendar.MINUTE, 30);
		time2.set(Calendar.SECOND, 10);
		
		System.out.println("time1 : "+time1.get(Calendar.HOUR_OF_DAY)+"시 "
				+time1.get(Calendar.MINUTE)+"분 "
				+time1.get(Calendar.SECOND)+"초");
		System.out.println("time2 : "+time2.get(Calendar.HOUR_OF_DAY)+"시 "
				+time2.get(Calendar.MINUTE)+"분 "
				+time2.get(Calendar.SECOND)+"초");
		
		long difference = 
				Math.abs(time1.getTimeInMillis() - time2.getTimeInMillis()) / 1000;
		System.out.println("tims1과 time2의 차이는 "+difference+"초입니다.");
		
		String tmp = "";	//***빈문자열
		for(int i=0; i<TIME_UNIT.length; i++) {
			tmp += difference/TIME_UNIT[i] + TIME_UNIT_NAME[i];
			//+= 인거 ***
			difference %= TIME_UNIT[i];
			//다음걸 %= ****
		}
		
		System.out.println("시분초로 변환하면 "+tmp+"입니다.");

	}

}

time1 : 10시 20분 40초
time2 : 20시 30분 10초
tims1과 time2의 차이는 36570초입니다.
시분초로 변환하면 10시간 9분 30초입니다.
  • 자바의정석 3판 5장 연습문제에 거스름돈 문제가 있다!
  • '5-6'


증가/감소1 : add()

  • 참조변수.add(Calendar.필드, 양수 또는 음수의 정수)
  • 특정 필드의 값을 증가/감소
  • 다른 필드에 영향을 줌

증가/감소2 : roll()

  • 참조변수.roll(Calendar.필드, 양수 또는 음수의 정수)
  • 특정 필드의 값을 증가/감소
  • 다른 필드에 영향을 안!! 줌!!

ex10_4

import java.util.Calendar;

public class Ex10_04 {

	public static void main(String[] args) {
		Calendar date = Calendar.getInstance();
		date.clear();
		date.set(2020, 7, 31); 	//2020년 8월 31일
		
		System.out.println(toString(date));
		
		System.out.println("== 1일 후 ==");
		date.add(Calendar.DATE, 1);
		System.out.println(toString(date));
		
		System.out.println("== 6달 전 ==");
		date.add(Calendar.MONTH, -6);
		System.out.println(toString(date));
		
		System.out.println("== 31일 후(roll) ==");
		date.roll(Calendar.DATE, 31);
		System.out.println(toString(date));
		
		System.out.println("== 31일 후(add) ==");
		date.add(Calendar.DATE, 31);
		System.out.println(toString(date));
	}
	
	public static String toString(Calendar date) {
		return date.get(Calendar.YEAR)+"년 "+
	(date.get(Calendar.MONTH)+1)+"월 "+
				date.get(Calendar.DATE)+"일";
	}

}

2020년 8월 31일
== 1일 후 ==
2020년 9월 1일
== 6달 전 ==
2020년 3월 1일
== 31일 후(roll) ==
2020년 3월 1일
== 31일 후(add) ==
2020년 4월 1일


  • 말일 구하기 : 다음달 1일 -1
  • 요일 구하기 필드명 : DAY_OF_WEEK

ex10_05

import java.util.Calendar;

public class Ex10_05 {

	public static void main(String[] args) {
		//콘솔에 입력한 값이 2개가 아니면 아래를 출력하고 끝
		if(args.length != 2) {
			System.out.println("Usage : java Ex10_5 2020 10");
			return;
		}
		int year = Integer.parseInt(args[0]);
		int month = Integer.parseInt(args[1]);
		int start_day_of_week = 0;	//1일의 요일
		int end_day = 0;	//달의 마지막 날
		
		Calendar sDay = Calendar.getInstance();	//시작일
		Calendar eDay = Calendar.getInstance();	//끝일
		
		//sDay = 2020년 10월(10으로 입력한다면->9) 1일
		sDay.set(year, month-1, 1);
		//eDay = 2020년 11월(10으로 입력한다면->11월) 1일
		eDay.set(year, month, 1);
		
		//마지막 날 구하기
		eDay.add(Calendar.DATE, -1);
		end_day = eDay.get(Calendar.DATE);
		//2020년 10월 31일
		
		//1일의 요일 구하기
		start_day_of_week = sDay.get(Calendar.DAY_OF_WEEK);
		
		System.out.println("      "+args[0]+"년 "+args[1]+"월");
		System.out.println(" SU MO TU WE TH FR SA");
		
		//***해당 월의 1일이 어느 요일인지에 따라 공백을 출력한다.
		for(int i=1; i<start_day_of_week; i++) {
			System.out.print("   ");
		}
		//***i는 마지막30 또는 31까지, n은 요일주기(7)
		for(int i=1, n=start_day_of_week; i<=end_day; i++, n++) {
			System.out.print((i<10)? "  "+i : " "+i);
			//***10부터는 빈칸의 길이도 적으니까!
			if(n%7==0) System.out.println();
		}

	}

}

Usage : java Ex10_5 2020 10

아이고 힘들다



Date ⇄ Calendar 변환

Calendar → Date 변환

Calendar cal = Calendar.getInstance();

...

Date d = new Date(cal.getTimeInMillis());
//Date(long date)


## Date → Calendar 변환

>
```java
Date d = new Date();

...

Calendar cal = Calendar.getInstance();
cal.setTime(d);



Ref

0개의 댓글

관련 채용 정보