시각과 기간의 인터페이스
날짜와 시간은 특정 시점의 시간(시각)과 시간의 간격(기간)으로 나눌 수 있다.
이에 따라, 인터페이스도 두 종류로 나뉜다.
1. 특정 시점의 시간

TemporalAccessor 인터페이스
- 날짜와 시간을 읽기 위한 기본 인터페이스 (읽기 전용)
- 특정 시점의 날짜와 시간 정보를 읽을 수 있는 기능 제공
Temporal 인터페이스
- 날짜와 시간을 조작하기 위한 기능 제공 (읽기, 쓰기 제공)
- 날짜와 시간을 변경하거나 조정 가능
2. 시간의 간격

TemporalAmount 인터페이스
- 시간의 간격
- 날짜와 시간 객체에 적용하여 그 객체를 조정 가능
즉, 일정 날짜에 일정 기간을 더하거나 빼기 가능
시간의 단위와 시간 필드의 인터페이스
시간의 단위를 뜻하는 TemporalUnit(ChronoUnit)과 시간의 각 필드를 의미하는 TemporalField(ChronField) 인터페이스가 있다.
1. 시간의 단위 - ChronoUnit

TemporalUnit 인터페이스
- 날짜와 시간을 측정하는 단위
- 구현:
java.time.temporal.ChronoUnit 열거형
ChronoUnit
- 다양한 시간 단위 제공
- 시간의 단위 하나하나를 나타냄
시간 단위
| ChronoUnit | 설명 |
|---|
| NANOS | 나노초 |
| MICROS | 마이크로초 |
| MILLIS | 밀리초 |
| SECONDS | 초 |
| MINUTES | 분 |
| HOURS | 시간 |
날짜 단위
| ChronoUnit | 설명 |
|---|
| HAFL_DAYS | 반일 |
| DAYS | 일 |
| WEEKS | 주 |
| MONTHS | 월 |
| YEARS | 년 |
| DECADES | 10년 |
| CENTURIES | 세기 |
| MILLENNIA | 1000년 |
기타
| ChronoUnit | 설명 |
|---|
| ERAS | 시대 |
| FOREVER | 무한대 |
ChronoUnit 주요 메서드
| 메서드 | 설명 |
|---|
between(Temporal startInclusive, Temporal endExclusive) | 두 Temporal 객체 간의 시간 단위 차이 계산 |
getDuration() | 해당 시간 단위의 기본 Duration 반환 |
isDateBased() | 이 시간 단위가 날짜 기반인지 여부 반환 |
isTimeBased() | 이 시간 단위가 시간 기반인지 여부 반환 |
isSupportedBy(Temporal) | Temporal 객체가 현재 ChronoUnit 단위를 지원하는지 여부 반환 |
addTo(Temporal temporal, long amount) | 지정된 Temporal 객체에 지정된 양의 시간 단위 추가 |
ChronoUnit 사용해보기
public class ChronoUnitMain {
public static void main(String[] args) {
System.out.println("====ChronoUnit values====");
ChronoUnit[] values = ChronoUnit.values();
for (ChronoUnit value : values) {
System.out.println(value);
}
System.out.println("=========================");
LocalTime time1 = LocalTime.of(15, 30, 10);
LocalTime time2 = LocalTime.of(16, 30, 20);
long secondsBt = ChronoUnit.SECONDS.between(time1, time2);
System.out.println("seconds between: " + secondsBt);
long minutesBt = ChronoUnit.MINUTES.between(time1, time2);
System.out.println("minutes between " + minutesBt);
LocalTime time = LocalTime.now();
LocalTime plusMinute = time.plus(30, ChronoUnit.MINUTES);
System.out.println("plus minutes " + plusMinute);
LocalTime plusSecond = time.plus(10, ChronoUnit.SECONDS);
System.out.println("plus seconds " + plusSecond);
}
}
====ChronoUnit values====
Nanos
Micros
Millis
Seconds
Minutes
Hours
HalfDays
Days
Weeks
Months
Years
Decades
Centuries
Millennia
Eras
Forever
=========================
seconds between: 3610
minutes between 60
plus minutes 16:14:50.401521
plus seconds 15:45:00.401521
2. 시간의 필드 - ChronoField

TemporalField 인터페이스
- 날짜와 시간을 타나냄
- 구현:
java.time.temporal.ChronoField 열거형
ChronoField
- 날짜와 시간의 특정 부분 나타냄
연도 관련 필드
| 필드명 | 설명 |
|---|
| ERA | 연대, AD 또는 BC |
| YEAR_OF_ERA | 연대 내의 연도 |
| YEAR | 연도 |
| EPOCH_DAY | 1970-01-01부터 일 수 |
월 관련 필드
| 필드명 | 설명 |
|---|
| MONTH_OF_YEAR | 월 |
| PROLEPTIC_MONTH | 연도를 월로 확장한 값 |
주, 일 관련 필드
| 필드명 | 설명 |
|---|
| DAY_OF_WEEK | 요일 (월요일=1) |
| ALIGNED_DAY_OF_WEEK_IN_MONTH | 월의 첫 번째 요일을 기준으로 정렬된 요일 |
| ALIGNED_DAY_OF_WEEK_IN_YEAR | 연의 첫 번째 요일을 기준으로 정렬된 요일 |
| DAY_OF_MONTH | 월의 일 |
| DAY_OF_YEAR | 연의 일 |
| EPOCH_DAY | 1970-01-01부터의 일 수 |
시간 관련 필드
| 필드명 | 설명 |
|---|
| HOUR_OF_DAY | 시간 (0-23) |
| CLOCK_HOUR_OF_DAY | 오전 오후 시간 (0-11) |
| HOUR_OF_AMPM | 오전/오후 세계 시간 (1-12) |
| MINUTE_OF_HOUR | 분 |
| SECOND_OF_MINUTE | 초 |
| NANO_OF_SECOND | 초의 나노초 (0-999,999,999) |
| MICRO_OF_SECOND | 초의 마이크로초 (0-999,999) |
| MILLI_OF_SECOND | 초의 밀리초 (0-999) |
기타 필드
| 필드명 | 설명 |
|---|
| AMPM_OF_DAY | 하루의 AM/PM 부분 |
| INSTANT_SECONDS | 초를 기준으로 한 시간 |
| OFFSET_SECONDS | UTC/GMT에서의 시간 오프셋 초 |
ChronoField 주요 메서드
| 메서드 | 설명 |
|---|
getBaseUnit() | 이 필드의 기본 단위 반환 |
getDisplayName() | 이 필드의 표시 이름 반환 |
getRangeUnit() | 이 필드의 범위 단위 반환 |
isDateBased() | 이 필드가 날짜 기반 필드인지 여부 반환 |
isTimeBased() | 이 필드가 시간 기반 필드인지 여부 반환 |
range() | 이 필드의 유효 범위 반환 |
ChronoField 사용해보기
public class ChronoFieldMain {
public static void main(String[] args)
System.out.println("== ChronoField values ==");
ChronoField[] values = ChronoField.values();
for (ChronoField value : values) {
System.out.println(value + ", range: " + value.range());
}
System.out.println("========================");
System.out.println("MONTH_OF_YEAR.range() = " + ChronoField.MONTH_OF_YEAR.range());
System.out.println("DAY_OF_MONTH.range() = " + ChronoField.DAY_OF_MONTH.range());
}
}
== ChronoField values ==
NanoOfSecond, range: 0 - 999999999
NanoOfDay, range: 0 - 86399999999999
...
InstantSeconds, range: -9223372036854775808 - 9223372036854775807
OffsetSeconds, range: -64800 - 64800
========================
MONTH_OF_YEAR.range() = 1 - 12
DAY_OF_MONTH.range() = 1 - 28/31
참고
Interface TemporalAccessor
Interface Temporal
Interface TemporalAmount
Enum Class ChronoUnit
Enum Class ChronoField
김영한의 실전 자바 - 중급 1편