학원/JAVA

9.29 12 -2 ETC CLASS (날짜관련 위주로)

도원결의 2022. 9. 29. 19:42

ETC 클래스....

날짜 정보를 다루는 클래스에 관해서 파헤쳐보자..... 난 날짜가 정말... 싫어......

- Date Class의 멤버변수들....
1.toString() : Date타입의 변수에 저장되어 있는 값 출력

date클래스도 저장된 날짜 데이터를 문자열로 반환되도록 오버라이딩 되었다. 따라서 변수값을 그냥 출력해도 주소값이 아닌 변수에 저장 되어 있는 값을 그대로 출력한다.

Date today = new Date(); => 현재 시스템 날짜 정보를 저장한다. 이거 하면 빨간줄감.. import처리 해준다!
System.out.println("today:"+today); =>원래 주소나와야하는데
System.out.println("today.toString:"+today.toString()); =>오버라이딩되어어서 출력값이 똑같네System.out.println("년도:"+(today.getYear()+1900)); =>.getYear() 요거 곧 사라질 거 지만 년도를 나타내주는 놈임
System.out.println("요일:"+dayOfWeek(today.getDay())); ==>.getDay()도 마찬가지지만 요일을 나타내주는 놈임

Date pasteDay = new Date(1970-1900,1-1,1,0,0,1) 밑에서도 계속 사용할 놈이라... => Date도 사라질 거 이거 기준이 영국 그레이치천문대 기준이라 우리나라랑 시간차이 있음 그래서 효용도가 별루.... 그닥.... 위에서 말은 안했지만 .getYear() dlrjeh +1900 해줘야 맞고 getDay()이거도 요일이 바로 출력되는게 아니고 1,2,3 으로 출력되서 아주 사용이 불편함! System.out.println(getDate(pasteDay));아무튼 출력 해 보면 나옴===> 1970년 1월 1일 0시 0분 1초

2. long 형타입 .getTime( )1970년 이래로 특정시점까지 흘러온 시간을 1/1000초 단위로 환산해줌
long diff = pasteDay.getTime(); =>long 형에다가 담아야 함!
System.out.println(diff+(9*60*60*1000));
==>출력 1000 (1/1000 초 단위니까?)


-Calendar Class 멤버들 쓰기전에 이놈도 바로쓰기 어려워서 메소드를 만들어 놓고 시작
public static String dayOfWeek(int day) { 요일변환
switch(day) {
case 0:return "일요일";
case 1:return "월요일";
case 2:return "화요일";
case 3:return "수요일";
case 4:return "목요일";
case 5:return "금요일";
default:return "토요일";
}
}/////////////

private static String getDate(Calendar cal) {
// cal.get(Calendar.AM_PM)의 반환값:0이면 오전 ,1이면 오후
return String.format("%d년 %d월 %d일 %s %d시 %d분 %d초",
cal.get(Calendar.YEAR),
cal.get(Calendar.MONTH)+1,
cal.get(Calendar.DATE),
cal.get(Calendar.AM_PM)==1?"오후":"오전",
cal.get(Calendar.HOUR),
cal.get(Calendar.MINUTE),
cal.get(Calendar.SECOND)
);
}///////////////////////////


Calendar cal = new Calendar(); 객체화 안됨... 이건 Single tone Design으로 정의 되어있어서(뭔소린지모름)

1 .getInstance() : 인스턴스화 할 때 사용 new 연산자 안쓰니 특이하죠?

Calendar cal = Calendar.getInstance( ) ; 객체화 = 메모리생성 = 인스턴스화
System.out.println("cal:"+cal);
System.out.println("cal.toString():"+cal.toString());
System.out.println("년도:"+cal.get(Calendar.YEAR));
//1:일요일, 2:월요일 ......7:토요일 (위에 메소드 만들어놓음)
System.out.println("요일:"+dayOfWeek(cal.get(Calendar.DAY_OF_WEEK)-1));
System.out.println(getDate(cal)); => 현재 일자 시간 출력

2.getTime()

Calendar타입을 Date타입으로 변환(상속관계가 아님으로 형변환 불가)
Date Calendar객체.getTime()로 변환해야 한다!
System.out.println(getDate(cal.getTime())); =>위랑 같이 현재 일자 시간 출력

3 .setTime(Date객체)

Calendar타입의 "시간"을 인자로 전달된 Date타입의 "시간"으로 변경
System.out.println("setTime호출전 날짜:"+getDate(cal)); =>현재 날짜 시간 출력
cal.setTime(pasteDay);
System.out.println("setTime호출후 날짜:"+getDate(cal)); =>pasteDay 이때 날짜 시간출력

4.set()

Calendar 타입으로 날짜 설정
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance(); =>새로운 Calendar 타입의 메모리 생성
Cf. 월은 0 based, 1월이 0
cal1.set(2022, 8-1, 31); =>년 월 일만 변경 설정한다면 시분초는 cal1의 시간정보 사용(생성시의 시간)cal2.set(2023,1-1,31,10,10,10); =>년 월 일 시분초까지도 변경가능
System.out.println(getDate(cal1)); 위에 메소드로 출력 => 2022년 8월 31일 시간은 출력시시간
System.out.println(getDate(cal2)); 위에 메소드로 출력 =>2023년 1월 31일 오전 10시 10분 10초 출력

-simpledateformat 클래스
-java.text패키지에 있는 클래스로 날짜관련 정보를 얻는데 유용한 클래스

SimpleDateFormat dateFomat = new SimpleDateFormat("yyyy-MM-dd a HH:mm:ss EEEE");
=>SimpleDateFormat타입의 메모리생성도하고 날짜패턴도 정해버리네

-simpledateformat 의 맴버들
1. .fomat( ) : date타입을 string으로 반환해줌

System.out.println("dateFormat:"+dateFormat); =>얘는 오버라이딩이 안되어있어서 주소가 걍 출력됨!
System.out.println("오늘날짜:"+dateFormat.format(today)); =>2022-09-29 오후 22:07:31 목요일
System.out.println("과거날짜:"+dateFormat.format(pasteDay)); =>1970-01-01 오전 00:00:01 목요일

2 .applyPattern : 중간에 날짜 패턴을 변경해 준다.

a는 오전/오후를 나타내는 패턴
만약 날짜 패턴에 at를 출력하고 싶다면 a는 패턴을 의미하는 문자 이기때문에
"yyyy년 MM월 dd일 at HH시"라고 하면 에러남 그래서 'at'으로 표현하면 a는 패턴을 의미하는게아니라 그냥 a문장에 해당
"yyyy년 MM월 dd일 'at' HH시"는 정상
dateFormat.applyPattern("yy년 M월 d일 a H시 m분 s초 입니다.");
System.out.println("오늘날짜:"+dateFormat.format(today)); => 22년 9월 29일 오후 22시 7분 31초 입니다.
System.out.println("과거날짜:"+dateFormat.format(pasteDay)); =>70년 1월 1일 오전 0시 0분 1초 입니다.

3 .parse( ) : String형식을 date형식으로 바꿔줌. 단 문자열은 날짜패턴과 일치해야한다

dateFormat.applyPattern("yyyy/MM/dd"); =>패턴 다시 쉬운걸로 바꿔놓고!
String stringDate = "2022/09/14"; => 요렇게 날짜 패턴에 맞는 String 이어야 함
Date startDate = dateFormat.parse(stringDate); =>2022년 9월 14일 0시 0분 0초
System.out.println(getDate(startDate)); =>아니 또 출력은 왜 위에꺼로해...

4 .topattern( ) : 패턴을 반환하는 메소드 . 쉽게말하면 어케 출력 설정되어있는지 알려달라는거...

System.out.println("설정한 날짜패턴 알려줘:"+dateFormat.toPattern());
===> 설정한 날짜패턴 알려줘 : yyyy/MM/dd 위에서 설정한 패턴이 요렇게 고대로 출력


배운것들을 활용 해 보아요

[날짜 차이를 구하는 방법]
--.getTime( ) 이용해서

SimpleDateFormat simple = new SimpleDateFormat ("yyyy.MM.dd") ;
String stFDate = "2022.03.10";
String stSDate = "2022.03.11";
1. string 타입을 date 타입으로 바꾼다 : parse이용
Date fDate = simple.parse(stFDate);
Date sDate = simple.parse(stSDate);
2. 1970년 1월1 일 0시 0분0초부터 각 날짜까지 흘러온 시간을 1000분의 1초 단위로 얻기 : Date클래스의 getTime()호출
long fTime = fDate.getTime();
long sTime =sDate.getTime();
diff = sTime-fTime; (위에보면 long 형으로 diff 변수선언 되어있음)
System.out.println(diff);
System.out.println("초단위:"+diff/1000);
System.out.println("분단위:"+diff/(1000*60));
System.out.println("시간단위:"+diff/(1000*60*60));
System.out.println("일단위:"+diff/(1000*60*60*24));
System.out.println("수료일까지 남은 일수:"+CommouUtil.getDifferenceDates("2022-9-29", "2023-2-23", "yyyy-MM-dd",'d'));
=> 출력
초단위:86400
분단위:1440
시간단위:24
일단위:1
수료일까지 남은 일수:147

문제) 그 사람과 사귀기 시작한 날이 2022년 2월 15일이다 100일째 되는 날은 언제인가?
Date의 getTime()으로 시간을 얻어서 +혹은 -
Date firstDate = simple.parse("2022.2.15"); SimpleDateFormat타입인 변수를 date 타입으로 변환
long firstTime=firstDate.getTime(); 날짜를 1000분의 1초 단위로 반환
long hundredTime =(long)100*24*60*60*1000; 100일째되는 날을 천분의 1초 단위로 바꿔서 처음 만난날에 더하기
System.out.println("100일째 되는 날:"+(simple.format(new Date(firstTime+hundredTime))));
출력할 땐 date타입을 string 타입으로 바꿔서 출력!



+++ date클래스의 날짜 차이관련 메소드
1.두 날짜 선후관계판단 메소드
boolean after()/before()
System.out.println(fDate.before(sDate));
System.out.println(fDate.after(sDate));

2.두날짜가 같은지 비교 =>true/false로 반환
.equals( ) 이거 주소비교 아님! 날짜비교로 오버라이딩 됨
System.out.println(fDate.equals(sDate));

.compareTo( ) 두 날짜가 같으면 0, 다르면 1이나-1 반환함, 두 날짜의 차이값은 계산하지 않는다!!
System.out.println(sDate.compareTo(fDate));