
- java.util.date : 날짜와 시간을 다룰 목적으로 만들어진 클래스
- Date의 메소드는 거의 사용하지 않기로 권장(deprecated)되었지만 여전히 쓰이고 있다.
- java.util.Calendar : Date클래스를 개선한 새로운 클래스(JDK 1.1)
- 여전히 단점이 존재
- java.time패키지 : Date와 Calendar의 단점을 개선한 새로운 클래스들을 제공 (JDK 1.8)
추상클래스이므로 getInstance()를 통해 구현된 객체를 얻어야한다.
Calendar cal = new Calendar() //에러!! 추상클래스이기때문에 객체생성이 불가능
//getInstance()로 객체생성
Calendar cal = Calendar.getInstance();
// 여러 달력중 사용자가 사용하는 달력을 찾아서 반환시켜줌. (한국은 그레고리력)
| 필드명 | 설명 |
|---|---|
| YEAR | 년 |
| MONTH | 월 (0~11월) (배열에 넣어놓은형태) |
| WEEK_OF_YEAR | 그 해의 몇 번째 주 |
| WEEK_OF_MONTH | 그 달의 몇 번째 주 |
| DATE | 일 |
| DAY_OF_MONTH | 그 달의 몇 번째 일 |
| DAY_OF_YEAR | 그 해의 몇 번째 일 |
| DAY_OF_WEEK | 요일 |
| DAY_OF_WEEK_IN_MONTH | 그 달의 몇 번째 요일 |
| 필드명 | 설명 |
|---|---|
| HOUR | 시간(0 ~ 11) |
| HOUR_OF_DAY | 시간(0 ~ 23) |
| MINUTE | 분 |
| SECOND | 초 |
| MILLISECOND | 1/1000 초 |
| ZONE_OFFSET | GMT기준 시차(1/1000초 단위) |
| AM_PM | 오전/오후 |
날짜와 시간 필드를 가져옴
Calendar cal = Calendar.getInstance(); //현재 날짜와 시간으로 셋팅
int thisYear = cal.get(Calendar(YEAR)); //올해가 몇년인지 알아냄
int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); //이달의 마지막날
날짜와 시간을 지정
void set(int field, int value)
void set(int year, int month, int date)
void set(int year, int month, int date, int hourOfDay, int minute)
void set(int year, int month, int date, int hourOfDay, int minute, int second)
MONTH가 0부터 시작함에 주의
Calendar date1 = Calendar.getInstance();
date1.set(2017,7,15); //2017년 8월 15일
//각각 지정도 가능
//date1.set(Calendar.YEAR, 2017);
//date1.set(Calendar.MONTH, 7);
//date1.set(Calendar.DATE, 15);
Calender time1 = Calender.getInstance();
//시간은 날짜와같이 한번에 지정할수가 없음. - 하기위해서는 날짜가 필요
//time1을 10시 20분 30초로 설정.
//time1.set(Calendar.HOUR_OF_DAY, 10);
//time1.set(Calendar.MINUTE, 20);
//time1.set(Calendar.SECOND, 30);
날짜를 밀리초로 변환해서 반환
//날짜간 차이 계산
Calendar date1 = Calendar.getInstance();
date1.set(2019, 3, 29);
Calendar date2 = Calendar.getInstance(); //오늘 날짜
long difference = (date2.getTimeInMillis() - date1.getTimeInMillis()) / 1000;
System.out.println("그 날(date1)부터 지금(date2)까지 " + difference + "초가 지났습니다.");
System.out.println("일(day)를 계산하면 " + difference/(24*60*60) + "일입니다.");
//1일 = 24 * 60 * 60
/* 출력
그 날(date1)부터 지금(date2)까지 129686400초가 지났습니다.
일(day)를 계산하면 1501일입니다.
*/
Calendar객체의 모든 필드를 초기화
Calendar dt = Calendar.getInstance();
//Thu Jun 08 11:13:27 KST 2023
System.out.println(new Date(dt.getTimeInMillis()));
//초기화
dt.clear();
//Thu Jan 01 00:00:00 KST 1970 첫 기준 시간(EPOCH TIME)
System.out.println(new Date(dt.getTimeInMillis()));
clear(int field)로 Calendar객체의 특정 필드를 초기화
Calendar dt = Calendar.getInstance();
//Thu Jun 08 11:13:27 KST 2023
System.out.println(new Date(dt.getTimeInMillis()));
//초기화
dt.clear(Calendar.SECOND); //초
dt.clear(Calendar.MINUTE); //분
//시간은 두종류 다 clear해야함.
dt.clear(Calendar.HOUR_OF_DAY); //시간 (0~23)
dt.clear(Calendar.HOUR); //시간 (0~11)
//Thu Jun 08 00:00:00 KST 2023
System.out.println(new Date(dt.getTimeInMillis()));
특정 필드의 값을 증가 또는 감소 (다른필드에 영향 ✅)
Calendar date = Calendar.getInstance();
date.clear(); //모든 필드를 초기화
date.set(2020, 7, 31); //2020년 8월 31일로 설정
date.add(Calendar.DATE, 1); //날짜(DATE)에 1을 더한다 - 2020/9/1일로 변경
date.add(Calendar.MONTH, -8); //월(MONTH)에 8을 뺀다 - 2020/1/1일로 변경
특정 필드의 값을 증가 또는 감소 (다른필드에 영향 ❌)
Calendar date = Calendar.getInstance();
date.clear(); //모든 필드를 초기화
date.set(2020, 7, 31); //2020년 8월 31일로 설정
date.roll(Calendar.DATE, 1); //날짜(DATE)에 1을 더한다 - 2020/8/1일로 변경
date.roll(Calendar.MONTH, -8); //월(MONTH)에 8을 뺀다 - 2020/12/1일로 변경
Calendar → Date 로 변환
Calendar cal = Calendar.getInstance();
Date d = new Date(cal.getTimeInMillis()); //Date(long date)
Date → Calendar 로 변환
Date d = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(d);
java.text패키지의 DecimalFormat, SimpleDateFormat
숫자와 날짜를 원하는 형식으로 쉽게 출력 가능(숫자,날짜 → 형식문자열)
double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0");
String result = df.format(number); //result = "1.2E6"
형식 문자열에서 숫자와 날짜를 뽑아내는 기능(형식 문자열 → 숫자,날짜)
DecimalFormat df = new DecimalFormat("#,###.##");
Number num = df.parse("1,234,567.89");
double d = num.doubleValue(); //1234567.89
숫자를 형식화할 때 사용 (숫자 → 형식 문자열)
double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0");
String result = df.format(number); //result = "1.2E6"
| 기호 | 의미 | 패턴 | 결과(1234567.89) |
|---|---|---|---|
| 0 | 10진수(값이 없을 때는 0) | 0 0.0 0000000000.0000 | 1234568 (반올림) 1234567.9 (첫째자리 반올림) 0001234567.8900 |
| # | 10진수 | # #.# ##########.#### | 1234568 (반올림) 1234567.9 (첫째자리 반올림) 1234567.89 |
| E | 지수기호 | #.#E0 0.0E0 0.000000000E0 00.00000000E0 #.#########E0 ##.########E0 | 1.2E6 (1.2 ⁶) 1.2E6 (1.2 ⁶) 1.234567890E6 (1.234567890 ⁶) 12.34567890E5 (12.3456789 ⁵) 1.23456789E6 (1.23456789 ⁶) 1.23456789E6 (1.23456789 ⁶) |
특정 형식의 문자열을 숫자로 변환할 때도 사용 (형식 문자열 → 숫자)
DecimalFormat df = new DecimalFormat("#,###.##");
Number num = df.parse("1,234,567.89");
double d = num.doubleValue(); //1234567.89
⁕ Integer.parseInt()는 콤마(,)가 포함된 문자열을 숫자로 변환 못함