java.util.Date
java.util.Calendar
추상클래스
✨getInstance()
를 통해 구현된 객체를 얻어야 한다.
: ✨✨Calendar cal = Calendar.getInstance();
✨필드 사용하기
: ✨✨cal.get(int field)
-> ✨✨cal.get(Calendar.YEAR)
java.time패키지
일반적인 객체 생성과 다르다!!
✨✨Calendar cal = Calendar.getInstance();
참조변수.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
모든 필드를 초기화
✨참조변수명.clear();
반드시 set()
전에 사용해야함!!!!
set()
은 완전히 똑같은 객체가 아니기 때문에 ms(1000분의 1초)에 차이가 날 수 있기 때문?
한번에 : ✨참조변수명.set(연, 월, 일);
나눠서
참조변수명.set(Calendar.YEAR, 연);
참조변수명.set(Calendar.MONTH, 월);
참조변수명.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초입니다.
참조변수.add(Calendar.필드, 양수 또는 음수의 정수)
참조변수.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일
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
아이고 힘들다
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);