[작성일: 2023. 02. 06]
날짜와 시간
java.util.Date
- 날짜와 시간을 다룰 목적으로 만들어진 클래스
- Date의 메서드는 거의 deprecated 되었지만, 여전히 쓰이고 있음.
java.util.Calendar
- Date 클래스를 개선한 새로운 클래스
- 여전히 단점 존재
java.time 패키지
- Date와 Calendar의 단점을 개선한 새로운 클래스들 제공
// 1. Calendar를 Date로 변환 Calendar cal = Calendar.getInstance(); ... Date d = new Date(cal.getTimeInMillis()); // 2. Date를 Calendar로 변환 Date d = new Date(); ... Calendar cal = Calendar.getInstance(); cal.setTime(d)
Calendar 클래스
- 추상 클래스이므로 getInstance()를 통해 구현된 객체를 얻어야 함.
- get()으로 날짜와 시간 필드 가져오기 - int get(int field)
Calendar cal = new Calendar(); // 에러! 추상클래스는 인스턴스 생성 불가능
Calendar cal = Calendar.getInstance(); // OK
// 현재 날짜와 시간으로 세팅됨.
int thisYear = cal.get(Calendar.YEAR); // 몇 년인지 알아내기
int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE); // 이 달의 마지막 날
Calendar에 정의된 필드
필드명 | 설명 |
YEAR | 년 |
MONTH | 월 (0부터 시작) |
WEEK_OF_YEAR | 1월 1일부터 몇 번째 주 |
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 | 천분의 일초 |
ZONE_OFFSET | GMT 기준 시차(천분의 일초 단위) |
AM_PM | 오전/오후 |
- set()으로 날짜와 시간 지정하기
void set(int field, int value)
void set(int year, int month, int dated)
void set(int year, int month, int dated, int hourOfDay, int minute)
void set(int year, int month, int dated, int hourOfDay, int minute, int second)
- 날짜 지정하는 방법. (월(MONTH)이 0부터 시작한다는 것 주의)
Calendar date1 = Calendar.getInstance();
date1.set(2023,1,6); // 3월 아님
// date1.set(Calendar.YEAR, 2023);
// date1.set(Calendar.MONTH, 1);
// date1.set(Calendar.DATE, 6);
- 시간 지정하는 방법
Calendar itme1 = Calendar.getInstance();
time1.set(Calendar.HOUR_OF_DAY, 10);
time1.set(Calendar.MINUTE, 20);
time1.set(Calendar.SECOND, 30);
// time1을 10시 20분 30초로 설정
- clear()는 Claendar 객체의 모든 필드를 초기화
Calendar dt = Calendar.getInstance();
System.out.println(new Date(dt.getTimeInMillis()));
dt.clear(); // 모든 필드 초기화
System.out.println(new Date(dt.getTimeInMillis()));
- clear(int field)는 Calendar 객체의 특정 필드를 초기화
Calendar dt = Calendar.getInstance();
System.out.println(new Date(dt.getTimeInMillis()));
dt.clear(Calendar.SECOND);
dt.clear(Calendar.MNINUTE);
dt.clear(Calendar.HOUR_OF_DAY);
dt.clear(Calendar.HOUR);
System.out.println(new Date(dt.getTimeInMillis()));
- add()는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향 O)
Calendar date = Calendar.getInstance();
date.clear(); // 모든 필드를 초기화
date.set(2023, 1, 6);
date.add(Calendar, DATE, 1); // 날짜에 1을 더함
date.add(Calendar, MONTH, -1); // 월에서 1을 뺌
- roll()은 특정 필드의 값을 증가 또는 감소(다른 필드에 영향 X)
date.set(2023, 1, 6);
// 23년 2월 6일로 설정
// add()와 달리 roll()은 다른 필드에 영향을 미치지 않음. 일이 넘어가도 월이 바뀌지 않음
date.roll(Calendar.DATE, 1); // 날짜에 1을 더함.
date.roll(Calendar.MONTH, -8); // 월에서 8을 뺌.
형식화 클래스
- 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
- 숫자를 형식화할 때 사용(숫자 ➡️ 형식 문자열)
- Integer.parseInt()는 콤마(,)가 포함된 문자열을 숫자로 변환할 수 없음.
double number = 1234567.89;
DecimalFormat df = new DecimalFormat("#.#E0");
String result = df.format(number); // result = "1.2E6"
기호 | 의미 | 패턴 | 결과 |
0 | 10진수(값이 없을 때는 0) | 0 0.0 0000000000.0000 |
1234568 1234567.9 0001234567.8900 |
# | 10진수 | # #.# ##########.#### |
1234568 1234567.9 1234567.89 |
E | 지수 | #,#E0 0.0E0 0.0000000000E0 00.00000000E0 #.#########E0 ##.########E0 |
1.2E6 1.2E6 1.234567890E6 12.34567890E5 1.23456789E6 1.23456789E6 |
SimpleDateFormat
- 날짜와 시간을 다양한 형식으로 출력할 수 있게 해 줌.
Date today = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String result = df.format(today);
기호 | 의미 | 보기 |
G | 연대(BC, AD) | AD |
y | 년도 | 2023 |
M | 월(1~12 또는 1월~12월) | 10 또는 10월 , OCT |
w | 년의 몇 번째 주(1~53) | 50 |
W | 월의 몇 번째 주(1~5) | 4 |
D | 년의 몇 번째 일(1~366) | 100 |
d | 월의 몇 번째 일(1~31) | 15 |
F | 월의 몇 번째 요일(1~5) | 1 |
E | 요일 | 월 |
- 특정 형식으로 되어 있는 문자열에서 날짜와 시간을 뽑아낼 수도 있음.
DateFormat df = new SimpleDateFormat("yyyy년 MM월 dd일");
DateFormat df2 = new SimpleDateFormat("yyyy/MM/dd");
Date d = df.parse("2023년 2월 6일"); // 문자열을 Date로 반환
String result = df2.format(d);
기호 | 의미 | 보기 |
a | 오전/오후(AM, PM) | PM |
H | 시간(0~23) | 20 |
k | 시간(1~24) | 13 |
K | 시간(0~11) | 10 |
h | 시간(0~12) | 11 |
m | 분(0~59) | 35 |
s | 초(0~59) | 55 |
S | 천분의 일초(0~999) | 253 |
z | Time zone(General time zone) | GMT+9:00 |
Z | Time zone(RFC 822 time zone) | +0900 |
' | escape문자(특수문자를 표현) | 없음 |
🐣 해당 게시글은 자바의 정석(남궁성 님) 영상으로 함께 공부하며 요약/정리한 글입니다.
🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.