① Calendar 클래스
Calendar cal=new Calendar(); //에러, 추상클래스는 인스턴스를 생성할 수 없다.
//getInstance()메서드는 Calendar클래스를 구현한 클래스의 인스턴스를 반환한다.
Calendar cal=Calendar.getInstance();
→ Calendar는 추상클래스이기 때문에 직접 객체를 생성할 수 없고, 메서드를 통해 완전히 구현된 클래스의 인스턴스를 얻어야 한다.
- Calendar 예제1 : getInstance()와 get메서드 사용법
import java.util.*;
class JavaJungsuk_Calendar_ex10_1 {
public static void main(String[] args) {
Calendar today=Calendar.getInstance();
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));
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("이 달의 몇 째 요일: "+todya.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));
//1000분의 1초를 시간으로 표시하기 위해 3600000로 나누었다.(1시간=60*60)
System.out.println("TimeZone(-12~+12): "+(today.get(Calendar.ZONE_OFFSET)/(60*60*1000)));
System.out.println("이 달의 마지막 날: "+today.getActualMaximum(Calendar.DATE));
}
}
결과
이 해의 년도: 2015
월(0~11, 0:1월): 10
이 해의 몇 째 주: 48
이 달의 몇 째 주: 4
이 달의 몇 일: 23
이 달의 몇 일: 23
이 해의 몇 일: 327
요일(1~7, 1:일요일): 2
이 달의 몇 째 요일: 4
오전_오후(0:오전, 1:오후): 1
시간(0~11): 3
시간(0~23): 15
분(0~59): 14
초(0~59): 48
1000분의 1초(0~999): 96
TimeZone(-12~+12): 9
이 달의 마지막 날: 30
→ getInstance()를 통해서 얻은 인스턴스는 기본적으로 현재 시스템의 날짜와 시간에 대한 정보를 담고 있다.
get메서드를 이용해서 원하는 필드의 값을 얻어올 수 있다.
→ 한 가지 주의해야할 것은 get(Calendar.MONTH)로 얻어오는 값의 범위가 1~12가 아닌 0~11이라는 것이다.
- Calendar 예제2 : set메서드 사용법
import.java.util.*;
class JavaJungsuk_Calendar_ex10_2 {
public static void main(String[] args) {
final String[] DAY_OF_WEEK={"", "일", "월", "화", "수", "목", "금", "토"};
Calendar date1=Calendar.getInstance();
Calendar date2=Calendar.getInstance();
date1.set(2019, 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=(date2.getTimeInMills()-date1.getTimeInMills())/1000; //초단위로 변경
System.out.println("그 날(date1)부터 지금(date2)까지 "+difference+"초가 지났습니다.");
System.out.println("일(day)로 계산하면 "+difference/(24*60*60)+"일입니다.");
}
public static String toString(Calendar date) {
return date.get(Calendar.YEAR)+"년 "+(date.get(Calendar.MONTH)+1)+"월 "+date.get(Calnedar.DATE)+"일 ";
}
}
결과
date1은 2019년 4월 29일 월요일이고,
오늘(date2)은 2019년 8월 7일 수요일입니다.
그 날(date1)부터 지금(date2)까지 8640000초가 지났습니다.
일(day)로 계산하면 100일입니다.
→ set메서드를 이용해서 날짜와 시간을 원하는 값으로 변경할 수 있다.
→ 두 날짜 간의 차이를 구하기 위해 두 날짜의 최소단위인 초단위로 변경한 후 그 차이를 구하는 예제이다.
getTimeInMills()는 1/1000초 단위로 값을 반환하기 때문에 초단위로 얻기 위해서는 1000을 나눠 주어야 하고,
일단위를 얻기 위해서는 24(시간)*60(분)*60(초)*1000으로 나눠야 한다.
- Calendar 예제3 : add메서드와 roll메서드 사용법
add() → 다른 필드에 영향O
date.set(2020, 7, 31); //2020.8.31
date.add(Calendar.DATE, 1); //DATE에서 1을 더한다.
=>9월 1일로 출력됨.
roll() → 다른 필드에 영향X
date.set(2020, 7, 31); //202.8.31
date.roll(Calendar.DATE, 1);
=>8월 1일로 출력됨.
import java.util.*;
class JavaJungsuk_Calendar_ex10_4 {
public static void main(String[] args) {
Calendar date=Calendar.getInstance();
date.set(2019, 7, 31);
Sysetm.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)+" 일";
}
}
결과
2019년 8월 31일
= 1일 후 =
2019년 9월 1일
= 6달 전 =
2019년 3월 1일
= 31일 후(roll) =
2019년 3월 1일
= 31일 후(add) =
2019년 4월 1일
→ add()메서드는 다른 필드에 영향을 주고, roll()메서드는 다른 필드에 영향을 주지 않는다.
② 형식화 클래스
: 숫자(10진수)를 형식화할 때 사용 (숫자->형식 문자열)
- DecimalFormat 예제1
import java.text.*;
class JavaJungsuk_DecimalFormat_ex10_6 {
public static void main(String[] args) {
double num=1234567.89;
String[] pattern= {
"0",
"#",
"0.0",
"#.#",
"0000000000.0000",
"##########.####",
"#.#-",
"-#.#",
"#,###.##",
"#,####.##",
"#E0",
"0E0",
"##E0",
"00E0",
"####E0",
"#.#E0",
"0.0E0",
"0.000000000E0",
"00.00000000E0",
"000.0000000E0",
"#.#########E0",
"##.########E0",
"###.#######E0",
"#,###.##+#;#,###.##-",
"#.#%",
"#.#\u2030",
"\u00A4 #,###",
"'#'#,###",
"''#,###",
};
for(int i=0; i<pattern.length; i++) {
DecimalFormat dt=new DecimalFormat(pattern[i]);
System.out.printf("%19s : %s\n", pattern[i], df.format(num));
}
}
}
결과
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
00E0 : 12E5
####E0 : 123.5E4
0000E0 : 1235E4
#.#E0 : 1.2E6
0.0E0 : 1.2E6
0.000000000E0 : 1.2345678890E6
00.00000000E0 : 12.34567890E5
000.0000000E0 : 123.4567890E4
#.##########0 : 1.23456789E6
##.#########0 : 1.23456789E6
###.########0 : 1.23456789E6
#,###.##+;#,###.##- : 1,234,567.89+
#.#% : 123456789%
#.#‰ : 1234567890‰
¤#,### : \1,234,568
'#'#,### : #1,234,568
''#,### : '1,234,568
→ 출력형식의 패턴을 작성하여 DecimalFormat인스턴스를 생성한 다음, 출력하고자 하는 문자열로 format메서드를 호출하면 원하는 패턴에 맞게 변환된 문자열을 얻게 된다.
- SimpleDateFormat
import java.util.*;
import java.text.*;
class JavaJungsuk_SimpleDateFormat_ex10_10 {
public static void main(String args[]) {
String pattern="yyyy/MM/dd";
DateFormat df=new SimpleDateFormat(pattern);
Scanner s=new Scaaner(System.in);
Date inDate=null;
System.out.println("날짜를 "+pattern+"의 형래토 입력해주세요.(입력예:2019/12/31)");
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.getTimeInMills()-today.getTimeInMills())/(60*60*1000);
System.out.println("입력하신 날짜는 현재와 "+day+"시간 차이가 있습니다.");
}
}
결과
C:\jdk1.8\work\ch10>java JavaJungsuk_SimpleDateFormat_ex10_10
날짜를 yyyy/MM/dd의 형태로 입력해주세요.(입력예:2019/12/31)
asdf
날짜를 yyyy/MM/dd의 형태로 다시 입력해주세요.(입력예:2019/12/31)
2019/12/31
입력하신 날짜는 현재와 3935시간 차이가 있습니다.
→ 화면으로부터 날짜를 입력받아서 입력한 날짜와 현재 날짜의 차이를 출력하는 예제이다.
while문과 try-catch문을 이용해서 올바른 형식으로 날짜가 입력될 때까지 반복해서 입력받도록 하였다.
'프로그래밍 > Java' 카테고리의 다른 글
Java_컬렉션 프레임웍(2)_List인터페이스_ArrayList, LinkedList, Stack과 Queue (0) | 2022.12.25 |
---|---|
Java_컬렉션 프레임웍(1) (0) | 2022.12.21 |
Java_Java.lang패키지와 유용한 클래스(4)_Math클래스와 메서드, 래퍼 클래스, 오토박싱&언박싱 (0) | 2022.12.14 |
Java_java.lang패키지와 유용한 클래스(3)_StringBuffer클래스 (0) | 2022.12.10 |
Java_java.lang패키지와 유용한 클래스(2)_String클래스 (0) | 2022.12.07 |