
Date클래스를 개선한 클래스로 JDK1.1부터 제공되었지만, 몇 가지 단점이 존재
추상클래스 -> 직접 객체 생성 불가
Calendar cal = new Calendar( );
(오류 : 추상클래스이므로 인스턴스 생성 불가)
Calendar cal = Calendar.getInstance( );
보통 get메서드를 통해 원하는 값을 얻어옴!
import java.util.*;
public class ch10 {
public static void main(String[] args)
{ // 디폴트 값 : 현재날짜와 시간으로 설정
Calendar today = Calendar.getInstance();
System.out.println("연도: "+ today.get(Calendar.YEAR));
// MONTH는 1~12가 아니라 0~11
System.out.println("월 "+ 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("요일(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));
}
}
연도: 2022
월 8
이 해의 몇째 주 39
이 달의 몇째 주 4
이 달의 몇 일 : 23
이 달의 몇 일 : 23
이 해 의 몇 일 : 266
요일(1~7) 1: 일요일 : 6
이 달의 몇째 요일 : 4
오전(0), 오후(1) : 1
시간(0~11) : 2
시간(0~23) 14
분(0~59) : 0
초(0~59) : 32
1000분의 1(0~999) : 388
package ch10;
import java.util.*;
public class Ex10_2 {
public static void main(String[] args) {
// 요일은 1부터 시작하기 때문에, DAY_OF_WEEK[0]은 비워두었다
final String[] DAY_OF_WEEK = {"", "일","월","화","수","목","금","토"};
Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();
//month의 경우 0부터 시작하기에 4월인 경우,3으로 지정해야함
// date1.set(2019, Calendar.APRIL, 29); 와 같이 할 수도 있다.
date1.set(2019,3,29); // 2019 4월 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)] + "요일입니다. ");
// 두 날짜간의 차이를 얻으려면, getTimeINMillis() 천분의 일초 단위로 변환해야 한다.
// TimeinMIllis() 천분의 1초 단위로 반환하기에 1000으로 나눠주어야
long difference = (date2.getTimeInMillis() - date1.getTimeInMillis()) / 1000;
System.out.println("date1과 date2의 초 차이는" + difference);
System.out.println("일로 계산하면 " + difference/(24*60*60) + "일입니다. ");
}
public static String toString(Calendar date) {
return date.get(Calendar.YEAR)+ "년 " + (date.get(Calendar.MONTH)+1) + "월 " +
date.get(Calendar.DATE) + "일 ";
}
}
date1은2019년 4월 29일 월요일이고,
오늘(date2)은2022년 9월 23일 금요일입니다.
date1과 date2의 초 차이는107395200
일로 계산하면 1243일입니다.
package ch10;
import java.util.*;
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);
time1.set(Calendar.HOUR_OF_DAY, 20);
time1.set(Calendar.MINUTE, 30);
time1.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(time2.getTimeInMillis() - time1.getTimeInMillis()) / 1000;
System.out.println("time1과 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 :20시 30분 10초
time2 :14시 28분 29초
time1과 time2의 차이는 21700초 입니다.
시 분초로 변환하면 6시간1분40초 입니다.
package ch10;
import java.util.Calendar;
public class Ex10_4 {
public static void main(String[] args) {
Calendar date = Calendar.getInstance();
date.set(2019,7,31); // 2019/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));
// roll은 다른 필드에 영향 미치지 않음!!
// 일 필드가 말일 일때 roll 메서드로 월 필드를 변경하면 일필드에 영향 미칠수도 있
System.out.println("= 31일 후(roll) = ");
date.roll(Calendar.DATE, 31);
System.out.println(toString(date));
System.out.println("= 31일 후 = ");
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) + "일 ";
}
}
2019년 8월 31일
= 1일 후 =
2019년 9월 1일
= 6달 =
2019년 3월 1일
= 31일 후(roll) =
2019년 3월 1일
= 31일 후 =
2019년 4월 1일
package ch10;
import java.util.*;
// Run Configuration에서 Argument 꼭 넣어주기!!
public class Ex10_5 {
public static void main(String[] args) {
if(args.length != 2)
{
System.out.println("Usage : java Ex10_5 2022 9");
return;
}
int year = Integer.parseInt(args[0]);
int month = Integer.parseInt(args[1]);
int START_DAY_OF_WEEK = 0;
int END_DAY = 0;
Calendar sDay = Calendar.getInstance(); // 시작일
Calendar eDay = Calendar.getInstance(); // 끝 일
// 월의 경우 0부터 11까지의 값을 가지므로 1을 빼주어야함.
sDay.set(year, month-1,1);
eDay.set(year, month,1);
// 다음달의 첫날(12월 1일)에서 하루를 빼면 현재달의 마지막날(11월 30일)이 된다.
eDay.add(Calendar.DATE, -1);
// 첫번째 요일이 무슨 요일인지 알아낸다.
START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
// eDay에 지정된 날짜를 얻어온다.
END_DAY = eDay.get(Calendar.DATE);
System.out.println(" " + args[0] + "년"+args[1]+"월");
System.out.println();
System.out.println(" SU MO TU WE TH FR SA");
//해당 월의 1일이 어느 요일인지에 따라서 공백 출력
// 만일 1일이 수요일이라면 공백을 세번 찍는다.(일요일 부터 시작)
for(int i =1; i < START_DAY_OF_WEEK; i++) {
System.out.print(" ");
}
for(int i = 1, n = START_DAY_OF_WEEK; i <= END_DAY; i++, n++)
{
System.out.print((i<10)? " "+ i : " " +i);
if(n%7==0) System.out.println();
}
}
}
2022년 9월
SU MO TU WE TH FR SA
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
Calendar cal = Calendar.getInstance();
...
Date d = new Date(cal.getTimeInMillis()); //Date(long date)
Date d = new Date();
...
Calendar cal = Calendar.getInstance();
cal.setTime(d)
형식화 클래스는 숫자, 날짜, 텍스트 데이터를 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 설계하여 표준화한 클래스
데이터를 정의된 패턴에 맞춰 형식화 할 수 있을 뿐 아니라 형식화된 데이터에서 원래의 데이터를 얻을 수 있다
숫자 데이터를 다양한 형식으로 표현하는 방법
출력 형식의 패턴을 작성하여 DecimalFormat 인스턴스 생성 후 출력하고자 하는 문자열로 format 메서드 호출
package ch10;
import java.text.*;
public class Ex10_6 {
public static void main(String[] args) {
double number = 1234567.89;
String[] pattern =
{
"0",
"#",
"0.0",
"#.#",
"0000000000.0000",
"##########.####",
"#.#-",
"-#.#",
"#,###.##",
"#,####.##",
"#E0",
"0E0",
"##E0",
"####E0",
"0000E0",
"#.#E0",
"0.0E0",
"0.000000000E0",
"00.00000000E0",
"000.0000000E0",
"#.#########E0",
"##.########E0",
"###.#######E0",
"#,###.##+;#,###.##-",
"#.#%",
"#.#\u2030",
"\u00A4 #,###",
"'#'#,###",
"''#,###",
};
for (int i = 0; i < pattern.length; i++)
{
DecimalFormat df = new DecimalFormat(pattern[i]);
System.out.printf("%19s : %s\n", pattern[i], df.format(number));
}
}
}
0 : 1234568
# : 1234568
0.0 : 1234567.9
#.# : 1234567.9
0000000000.0000 : 0001234567.8900
##########.#### : 1234567.89
#.#- : 1234567.9-
-#.# : -1234567.9
#,###.## : 1,234,567.89
#,####.## : 123,4567.89
#E0 : .1E7
0E0 : 1E6
##E0 : 1.2E6
####E0 : 123.5E4
0000E0 : 1235E3
#.#E0 : 1.2E6
0.0E0 : 1.2E6
0.000000000E0 : 1.234567890E6
00.00000000E0 : 12.34567890E5
000.0000000E0 : 123.4567890E4
#.#########E0 : 1.23456789E6
##.########E0 : 1.23456789E6
###.#######E0 : 1.23456789E6
#,###.##+;#,###.##- : 1,234,567.89+
#.#% : 123456789%
#.#‰ : 1234567890‰
¤ #,### : ₩ 1,234,568
'#'#,### : #1,234,568
''#,### : '1,234,568
package ch10;
import java.text.*;
public class Ex10_7 {
public static void main(String[] args)
{
DecimalFormat df = new DecimalFormat("#,###.##");
DecimalFormat df2 = new DecimalFormat("#.###E0");
try {
// parse 메서드는 기호와 문자가 포함된 문자열을 숫자로 변환
// Integer.parseInt는 콤마가 포함된 문자열을 숫자로 변환 X
Number num = df.parse("1,234,567.89");
System.out.print("1,234,567.89" + " -> ");
// Number에 저장된 값을 double형의 값으로 반환
double d = num.doubleValue();
System.out.print(d + " -> ");
System.out.println(df2.format(num));
} catch (Exception e) {}
}
}
1,234,567.89 -> 1234567.89 -> 1.235E6
날짜 데이터를 원하는 형태로 표시

원하는 출력형식 패턴 장석해서 SimpleDateFormat 인스턴스 생성 후, 출력하고자 하는 Date인스턴스를 가지고 format 호출
package ch10;
import java.util.*;
import java.text.*;
public class Ex10_8 {
public static void main(String[] args) {
Date today = new Date();
SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
SimpleDateFormat sdf5, sdf6, sdf7, sdf8, sdf9;
sdf1 = new SimpleDateFormat("yyyy-MM-dd");
sdf2 = new SimpleDateFormat("''y년 MMM dd일 E요일");
sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm ss.SSS");
sdf4 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");
sdf5 = new SimpleDateFormat("오늘은 올 해의 D번째 날입니다.");
sdf6 = new SimpleDateFormat("오늘은 이 달의 d번째 날입니다.");
sdf7 = new SimpleDateFormat("오늘은 올 해의 w번째 입니다.");
sdf8 = new SimpleDateFormat("오늘은 이 달 의 W번째 입니다.");
sdf9 = new SimpleDateFormat("오늘은 이 달의 F번째 E요입니다.");
System.out.println(sdf1.format(today));
System.out.println(sdf2.format(today));
System.out.println(sdf3.format(today));
System.out.println(sdf4.format(today));
System.out.println();
System.out.println(sdf5.format(today));
System.out.println(sdf6.format(today));
System.out.println(sdf7.format(today));
System.out.println(sdf8.format(today));
}
}
2022-09-25
'2022년 9월 25일 일요일
2022-09-25 18:47 52.133
2022-09-25 06:47:52 오후
오늘은 올 해의 268번째 날입니다.
오늘은 이 달의 25번째 날입니다.
오늘은 올 해의 40번째 입니다.
오늘은 이 달 의 5번째 입니다.
package ch10;
import java.util.*;
import java.text.*;
public class Ex10_9 {
public static void main(String[] args) {
DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");
try {
/* parse는 문자열을 날짜 Date인스턴스로 변환해 줌
(SimpleDateFormat의 조상인 DateFormat에 정의)
원래라면 문자열을 날짜로 인식하기 위해 substring 이용 해야 함.*/
Date d = df.parse("2019년 11월 23일");
System.out.println(df2.format(d));
}catch(Exception e) {}
}
}
2019/11/23
package ch10;
import java.util.*;
import java.text.*;
public class Ex10_10 {
public static void main(String[] args) {
String pattern = "yyyy/MM/dd";
DateFormat df = new SimpleDateFormat(pattern);
Scanner s = new Scanner(System.in);
Date inDate = null;
System.out.println("날짜를 " + pattern
+ "의 형태로 입력해주세요(입력예 : 2019/12/31)");
//먼저 hasNextLine()은 다음에 읽을 값이 있는지 확인하는 불린타입의 메소드로 값이 있으면 트루를 반환한다.
/* 지정된 패턴으로 인력하지 않을 시 Exception이 발생하여
while 탈출 못함 */
while(s.hasNextLine()) {
try {
inDate = df.parse(s.nextLine());
break;
}catch(Exception e) {
System.out.println("날짜를 " + pattern
+ "의 형태로 다시 입력해주세요(입력예 : 2019/12/31)");
}
}
Calendar cal = Calendar.getInstance();
cal.setTime(inDate);
Calendar today = Calendar.getInstance();
long day = (cal.getTimeInMillis()
- today.getTimeInMillis())/(60*60*1000);
System.out.println("입력 하신 날짜는 현재와 " + day + " 시간 차이가 납니다. ");
}
}
날짜를 yyyy/MM/dd의 형태로 입력해주세요(입력예 : 2019/12/31)
2030/01/01
입력 하신 날짜는 현재와 63700 시간 차이가 납니다.