Calendar와 Date
java.util.Date
- 날짜와 시간을 다룰 목적으로 만들어진 클래스(JDK1.0)
- Date 메서드는 거의 deprecated(앞으로 사용x)되었지만, 여전히 쓰이고 있다.
java.util.Calendar
- Date클래스를 개선한 새로운 클래스(JDK1.1) 여전히 단점이 존재
java.time패키지
- Date와 Calendar의 단점을 개선한 새로운 클래스들을 제공(JDK1.8)
- Date와 Calendar의 단점은 항상 날짜와 시간을 같이 쓰는 것!
Calendar클래스
- 추상 클래스이므로 직접 객체를 생성할 수 없고, getInstance( )를 통해 구현된 객체를 얻어야 한다.
Calendar cal = new Calendar(); // 에러!!! 추상클래스는 인스턴스를 생성할 수 없다.
// OK, getInstance()메서드는 Calendar클래스를 구현한 클래스의 인스턴스를 반환한다.
Calendar cal = Calendar.getInstance();
get( ) 메서드
- get()으로 날짜와 시간 필드 가져오기 – int get(int field)
Calendar cal = Calendar.getInstance(); // 현재 날짜와 시간이 입력된 객체 생성!
int thisYear = cal.get(Calendar.YEAR);
// get메서드로 년도를 가져와서 thisYear에 넣기
int thisMonth = cal.get(Calendar.MONTH)+1;
// get메서드로 달을 가져와서 thisMonth에 넣기(달은 0부터 시작, 결과값에서 +1해주기)
System.out.println(thisYear);
System.out.println(thisMonth);
Calendar에 정의된 필드
1) 날짜 관련 필드
2) 시간 관련 필드
Date와 Calendar간의 변환
- Date의 메서드는 대부분 deprecated(사용하지 않을 것을 권장)되었지만 여전히 사용
예제1) Calendar 객체를 getInstance( )로 생성하고 get( )을 사용해서 필드를 출력(날짜 계산)
import java.util.Calendar;
public class Ex10_1 {
public static void main(String[] args) {
// 기본적으로 현재날짜와 시간으로 설정된다.
// 날짜 필드
Calendar today = Calendar.getInstance(); // Calendar 객체를 생성
System.out.println("이 해의 년도: " + today.get(Calendar.YEAR));
System.out.println("월(0~11, 0:1월): " + today.get(Calendar.MONTH));
System.out.println("이 해의 몇 째 주: " + today.get(Calendar.WEEK_OF_YEAR));
System.out.println("이 달의 몇 째 주: " + today.get(Calendar.WEEK_OF_MONTH));
// DATE와 DAY_OF_MONTH는 같음
System.out.println("이 달의 몇 일: " + today.get(Calendar.DATE));
System.out.println("이 달의 몇 일: " + today.get(Calendar.DAY_OF_MONTH));
System.out.println("이 해의 몇 일: " + today.get(Calendar.DAY_OF_YEAR));
System.out.println("이 달의 마지막날: " + today.getActualMaximum(Calendar.DATE));
// 요일
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("오전_오후(0:오전, 1:오후): " + today.get(Calendar.AM_PM));
System.out.println("시간(0~11): " + today.get(Calendar.HOUR));
System.out.println("시간(0~23): " + 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));
}
}
예제2) Calendar 객체를 getInstance( )로 생성하고 set( )을 사용해서 날짜와 시간을 지정
- set( )으로 날짜와 시간지정하기
-> 년, 월, 일 / 시, 분, 초
- 날짜 지정하는 방법. 월(MONTH)이 0부터 시작한다는 점에 주의
-> 년, 월, 일을 한 번에 설정할 수도 있고, 나눠서 설정할 수 있음
- 시간 지정하는 방법
-> 시간은 하나씩 다 따로 설정해줘야 함
예제3) Calendar 객체를 getInstance( )로 생성하고 set( )을 사용해서 날짜와 시간을 지정한 다음 시간의 차이를 출력
-> 두 개의 시간 데이터로부터 초 단위로 차이를 구한 다음, 시분초로 바꿔 출력하는 예제
import java.util.Calendar;
public class Ex10_3 {
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.set(Calendar.HOUR_OF_DAY,10); // time1을 10시 20분 30초로 설정
time1.set(Calendar.MINUTE,20);
time1.set(Calendar.SECOND,30);
System.out.println("time1: "+time1.get(Calendar.HOUR_OF_DAY)+"시 "
+ time1.get(Calendar.MINUTE)+"분 " + time1.get(Calendar.SECOND)+"초");
time2.set(Calendar.HOUR_OF_DAY,20); // time2를 20시 30분 10초로 설정
time2.set(Calendar.MINUTE,30);
time2.set(Calendar.SECOND,10);
System.out.println("time2: "+time2.get(Calendar.HOUR_OF_DAY)+"시 "
+ time2.get(Calendar.MINUTE)+"분 "+time2.get(Calendar.SECOND)+"초");
// time2가 더 크면 음수가 나올 수도 있기 때문에 절대값 메서드로 감쌌다.(1) 시분초 -> 초
long difference = Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis())/1000;
System.out.println("time1과 time2의 차이는 " + difference + "초 입니다.");
String tmp = "";
for(int i=0;i<TIME_UNIT.length;i++) { // (2) ms -> 시분초
tmp += difference/TIME_UNIT[i] + TIME_UNIT_NAME[i]; // 거스름돈 동전 개수구하기와 동일
difference %= TIME_UNIT[i];
}
System.out.println("시분초로 변환하면 " + tmp + "입니다.");
}
}
예제4)
- clear( )는 Calendar객체의 모든 필드를 초기화
Calendar cal = Calendar.getInstance();
Date date = new Date();
//System.out.println(cal.getTimeInMillis()); // 1641615338380
System.out.println(date); // Sat Jan 08 13:17:23 KST 2022
System.out.println(new Date(cal.getTimeInMillis())); // Sat Jan 08 13:17:23 KST 2022
//위의 두코드는 동일함(Calendar객체는 생성되면 현재시간으로 초기화)
cal.clear(); // 모든 필드를 초기화
System.out.println(new Date(cal.getTimeInMillis()));// Thu Jan 01 00:00:00 KST 1970
- clear(int field)는 Calendar객체의 특정 필드를 초기화
Calendar cal = Calendar.getInstance();
System.out.println(new Date(cal.getTimeInMillis())); // Sat Jan 08 13:26:03 KST 2022
//cal.set(Calendar.SECOND,0), cal.clear(cal.SECOND)와 동일
cal.clear(Calendar.SECOND); // 초를 초기화
cal.clear(Calendar.MINUTE); // 분을 초기화
//HOUR은 오전과 오후로 나눔 0-12 / HOUR_OF_DAY는 24시간
//시간을 초기화
//cal.clear(Calendar.HOUR); // Sat Jan 08 13:00:00 KST 2022
//cal.clear(Calendar.HOUR_OF_DAY); // Sat Jan 08 13:00:00 KST 2022
//cal.set(Calendar.HOUR, 0); // Sat Jan 08 12:00:00 KST 2022
//cal.set(Calendar.HOUR_OF_DAY,0); // Sat Jan 08 00:00:00 KST 2022
예제5)
- add( )는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향O)
-> 양수말고 음수도 사용가능
- roll( )은 특정 필드의 값을 증가 또는 감소(다른 필드에 영향X)
import java.util.Calendar;
public class EX10_4 {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
cal.set(2019, 7, 31); // 2019년 8월 31일
// toString 메서드 따로 생성
System.out.println(toString(cal)); // 2019년8월31일
System.out.println("= 1일 후 =");
cal.add(Calendar.DATE, 1);
System.out.println(toString(cal)); // 2019년9월1일
System.out.println("= 6달 전 =");
cal.add(Calendar.MONTH, -6);
System.out.println(toString(cal)); // 2019년3월1일
// add()와 달리 roll은 다른 필드에 영향을 주지 않음
System.out.println("= 31일 후 =(roll)");
cal.roll(Calendar.DATE, 31); // date만 1일로 변하고 month는 그대로
System.out.println(toString(cal)); // 2019년3월1일
System.out.println("= 31일 후 =(add)");
cal.add(Calendar.DATE, 31); // 31일을 더해서 월도 함께 4월로 바뀜!
System.out.println(toString(cal)); // 2019년4월1일
}
private static String toString(Calendar cal) {
return cal.get(Calendar.YEAR) + "년" + (cal.get(Calendar.MONTH)+1) + "월" +
cal.get(Calendar.DATE) + "일";
}
}
https://everysmallstep.tistory.com/80?category=1045245
'멀티캠퍼스 풀스택 과정 > Java의 정석' 카테고리의 다른 글
자바의 정석8-1 컬렉션프레임워크(List, Set, Map) (0) | 2022.01.08 |
---|---|
자바의 정석7-2 형식화 클래스(DecimalFormat,SimpleDateFormat) (0) | 2022.01.08 |
자바의 정석6-4 오토박싱 & 언박싱 (0) | 2022.01.07 |
자바의 정석6-3 Math클래스, Rapper클래스, Number클래스 (0) | 2022.01.07 |
자바의 정석6-2 String 클래스, Stringbuffer(StringBuilder) (0) | 2022.01.07 |