[Java의 정석] 날짜와 시간 & 형식화

Shiba·2023년 6월 8일
post-thumbnail

📓 날짜와 시간 & 형식화

  • java.util.date : 날짜와 시간을 다룰 목적으로 만들어진 클래스
    • Date의 메소드는 거의 사용하지 않기로 권장(deprecated)되었지만 여전히 쓰이고 있다.
  • java.util.Calendar : Date클래스를 개선한 새로운 클래스(JDK 1.1)
    • 여전히 단점이 존재
  • java.time패키지 : Date와 Calendar의 단점을 개선한 새로운 클래스들을 제공 (JDK 1.8)

📕 Calendar 클래스

추상클래스이므로 getInstance()를 통해 구현된 객체를 얻어야한다.

Calendar cal = new Calendar() //에러!! 추상클래스이기때문에 객체생성이 불가능

//getInstance()로 객체생성
Calendar cal = Calendar.getInstance(); 
// 여러 달력중 사용자가 사용하는 달력을 찾아서 반환시켜줌. (한국은 그레고리력)

🔷 Calendar에 정의된 필드

◼ 날짜

필드명설명
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
MILLISECOND1/1000 초
ZONE_OFFSETGMT기준 시차(1/1000초 단위)
AM_PM오전/오후

🔷 get()

날짜와 시간 필드를 가져옴

Calendar cal = Calendar.getInstance(); //현재 날짜와 시간으로 셋팅
int thisYear = cal.get(Calendar(YEAR)); //올해가 몇년인지 알아냄
int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); //이달의 마지막날 

🔷 set()

날짜와 시간지정

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)

◼ 날짜를 지정하는 방법

MONTH0부터 시작함주의

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);

🔷 getTimeInMillis()

날짜밀리초로 변환해서 반환

//날짜간 차이 계산

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일입니다.
*/

🔷 clear()

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()));

🔷 add()

특정 필드증가 또는 감소 (다른필드에 영향 ✅)

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일로 변경

🔷 roll()

특정 필드증가 또는 감소 (다른필드에 영향 ❌)

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일로 변경

🔷 Date와 Calendar간의 변환

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

🔷 DecimalFormat

숫자형식화할 때 사용 (숫자 → 형식 문자열)

double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0");
String result = df.format(number); //result = "1.2E6"
기호의미패턴결과(1234567.89)
010진수(값이 없을 때는 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()는 콤마(,)가 포함된 문자열을 숫자로 변환 못함

profile
모르는 것 정리하기

0개의 댓글