날짜와 시간 & 형식화
Date 와 Calendar
자바에서 날짜와 시간을 다루는 클래스 : Date
(JDK 1.0), Calendar
(JDK 1.1)
Date
클래스의 대부분의 함수는 Deprecated 되어있어 사용하지 않는 것을 권장한다.
객체 생성
사용하려면 java.util 패키지를 import 해야한다.
Date 클래스 객체 생성
1
Date date = new Date();
Calendar 클래스 객체 생성
1
Calendar calendar = Calendar.getInstance();
Calendar 클래스는 추상 클래스로 직접 객체를 생성할 수 없다. 그래서 Calendar 클래스의 구현체로 객체를 생성해야 하는데 new 키워드를 사용하지 않고 getInstance 메서드를 사용하면 변경사항이 있을 때 getInstance 메서드만 수정하면 되고 참조한 쪽에서는 수정을 하지 않아도 되는 이점이 있다. Calendar 클래스의 구현체로는 GregorianCalendar , BuddhistCalendar , JapaneseImperialCalendar 가 있다.
Date 와 Calendar 간의 변환
Calendar → Date
1 2
Calendar calendar = Calendar.getInstance(); Date date = new Date(calendar.getTimeInMills());
Date → Calendar
1 2 3
Date date = new Date(); Calendar calendar = Calendar.getInstance(); cal.setTime(d);
Calendar 원하는 데이터 조회
Calendar | 설명 | 비고 |
---|---|---|
YEAR | 년 | |
MONTH | 월 | 0 ~ 11 (0 = 1월) |
DATE | 일 | |
DAY_OF_MONTH | ||
DAY_OF_WEEK | 요일 | 1 ~ 7 (1 = 일요일) |
AM_PM | 오전/오후 | 0 = 오전 1 = 오후 |
HOUR | 시간 | 0 ~ 11 |
HOUR_OF_DAY | 0 ~ 23 | |
MINUTE | 분 | |
SECOND | 초 | |
MILLISECOND | 밀리초 | |
WEEK_OF_YEAR | 올해의 몇번째 주인지 | |
WEEK_OF_MONTH | 이번 달의 몇번째 주인지 | |
DAY_OF_YEAR | 올해 중 몇일인지 |
이번 달의 마지막 날을 구하는 방법
calendar.getActualMaximum(Calendar.DATE);
특정 필드 조작
1
2
3
4
Calendar today = Calendar.getInstance();
// 일 하루 증가
today.add(Calendar.DATE, 1);
today.roll(Calendar.DATE, 1);
add 메서드와 roll 메서드의 차이점은 roll 메서드는 어떤 필드가 변경될 때 다른 필드에 영향을 미치지 않는다.
단, 예외가 있는데 DATE 필드가 31 일 때 MONTH 필드를 수정하면 DATE 필드가 변경될 수 있다. (예. 31일이 마지막 일인 달에서 다른 달로 변경할 때)
형식화
DecimalFormat : 숫자 형식화
123,456 문자를 123456 정수로 변경하거나 123456 정수를 123,456 문자로 변경하는 등의 작업을 편리하게 할 수 있다.
1
2
3
4
5
6
7
// String -> Integer
DecimalFormat format = new DecimalFormat("#,###");
int number = format.parse("1,234,567").intValue(); // 예외처리 필요(try-catch or throws Exception)
// Integer -> String
DecimalFormat format = new DecimalFormat("#,###");
String strNumber = format.format(123456);
SimpleDateFormat : 날짜 형식화
Date 나 Calendar 객체의 값을 출력하거나 날짜 형식의 문자(2023-12-31)를 Date 나 Calendar 로 변경하는 등의 작업을 편리하게 할 수 있다.
기호 | 의미 |
---|---|
y | 년도 |
M | 월 |
d | 일 |
E | 요일 |
a | 오전/오후 |
H | 시(0~23) |
h | 시(1~12) |
k | 시(1~24) |
K | 시(0~11) |
m | 분 |
s | 초 |
S | 밀리세컨 |
‘ | 특수문자 표현에 사용 |
1
2
3
4
5
6
7
8
9
// Date 출력
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(format.format(new Date()));
// Calendar 출력
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(format.format(Calendar.getInstance().getTime()));
// 날짜 문자 -> Date 변환
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse("2023-12-31");
java.time 패키지 (JDK 1.8)
java.time 패키지의 클래스들은 불변성을 가지고 있다. (멀티쓰레드 환경에서 안전)
- 시간 표현 클래스 : LocalTime
- 날짜 표현 클래스 : LocalDate
- 날짜 & 시간 표현 클래스 : LocalDateTime
- 날짜 & 시간 & 시간대 표현 클래스 : ZonedDateTime
- 날짜와 시간 초단위 표현 클래스 : Instant
- 날짜간의 차이 표현 클래스 : Period
- 시간 차이 표현 클래스 : Durarion
객체 생성
1
2
3
4
5
6
7
8
9
// now()
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
// of()
LocalDate date = LocalDate.of(2023, 12, 11);
LocalTime time = LocalTime.of(22, 29, 00);
LocalDateTime dateTime = LocalDateTime.of(date, time);
java.time 패키지 클래스를 Calendar 클래스로 변환하는 방법
Calendar calendar = GregorianCalendar.from(ZonedDateTime.now());
날짜와 시간 필드
get 메서드로 원하는 데이터를 조회할 때 사용된다.
TemporalField(ChronoField) | 설명 | 비고 |
---|---|---|
YEAR | 년 | |
MONTH_OF_YEAR | 월 | |
DAY_OF_MONTH | 일 | |
DAY_OF_WEEK | 요일 | 1 ~ 7 (1 = 월요일) |
AMPM_OF_DAY | 오전/오후 | |
HOUR_OF_DAY | 시간 | 0 ~ 23 |
CLOCK_HOUR_OF_DAY | 1 ~ 24 | |
HOUR_OF_AMPM | 0 ~ 11 | |
CLOCK_HOUR_OF_AMPM | 1 ~ 12 | |
MINUTE_OF_HOUR | 분 | |
SECOND_OF_MINUTE | 초 | |
MILLI_OF_SECOND | 밀리초 | |
MICRO_OF_SECOND | 마이크로초 | getLong 메서드를 사용해야 함 |
NANO_OF_SECOND | 나노초 | getLong 메서드를 사용해야 함 |
DAY_OF_YEAR | 올해 중 몇일인지 |
날짜와 시간 단위
with , plus , minus 메서드로 특정 필드를 조작할 때 사용된다.
TemporalUnit(ChronoUnit) | 설명 |
---|---|
YEARS | 년 |
MONTHS | 월 |
DAYS | 일 |
HOURS | 시 |
MINUTES | 분 |
SECONDS | 초 |
형식화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// LocalTime 출력
LocalTime time = LocalTime.now();
System.out.println(time.format(DateTimeFormatter.ofPattern("HH:mm:ss")));
// LocalDate 출력
LocalDate date = LocalDate.now();
System.out.println(date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
// LocalDateTime 출력
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
// LocalTime 파싱
LocalTime time = LocalTime.parse("23:59:59");
// LocalDate 파싱
LocalDate date = LocalDate.parse("2023-12-31");
// LocalDateTime 파싱
LocalDateTime dateTime = LocalDateTime.parse("2023-12-31T23:59:59");