시간 필드(temporal field)란 날짜와 시간을 구성하는 개별 요소를 의미합니다. 예를 들어 '연중 몇 번째 달', '몇 시' 같은 값들이 대표적입니다. Java에서는 이러한 필드를 TemporalField 인터페이스로 표현하며, ChronoField 클래스가 이 인터페이스를 구현하여 표준 필드 집합을 제공합니다.
ChronoField에서 지원하는 시간 관련 필드
ChronoField 클래스는 아래와 같은 다양한 시간 관련 필드를 지원합니다.
| 필드 | 설명 |
|---|---|
| CLOCK_HOUR_OF_AMPM | 오전/오후(am/pm) 기준의 시계 시간(1~12)을 나타냅니다. |
| AMPM_OF_DAY | 하루 중 오전(AM)인지 오후(PM)인지를 나타냅니다. (오전: 0, 오후: 1) |
| CLOCK_HOUR_OF_DAY | 하루의 시계 시간(1~24)을 나타냅니다. |
| HOUR_OF_AMPM | 오전/오후 기준의 시간(0~11)을 나타냅니다. |
| HOUR_OF_DAY | 하루의 시간(0~23)을 나타냅니다. |
| INSTANT_SECONDS | 에포크(epoch) 기준 초 단위의 순간 값을 나타냅니다. |
| MICRO_OF_DAY | 하루 기준의 마이크로초 값을 나타냅니다. |
| MICRO_OF_SECOND | 초 기준의 마이크로초 값을 나타냅니다. |
| MILLI_OF_DAY | 하루 기준의 밀리초 값을 나타냅니다. |
| MILLI_OF_SECOND | 초 기준의 밀리초 값을 나타냅니다. |
| MINUTE_OF_DAY | 하루 기준의 분 값을 나타냅니다. |
| MINUTE_OF_HOUR | 시간(hour) 내의 분 값을 나타냅니다. |
| MONTH_OF_YEAR | 연중 몇 번째 달인지 나타냅니다. |
| NANO_OF_DAY | 하루 기준의 나노초 값을 나타냅니다. |
| NANO_OF_SECOND | 초 기준의 나노초 값을 나타냅니다. |
| OFFSET_SECONDS | UTC/그리니치로부터의 시간 오프셋(초)을 나타냅니다. |
| PROLEPTIC_MONTH | 역산월(proleptic month), 즉 연도를 개월 수로 확장한 값을 나타냅니다. |
| SECOND_OF_DAY | 하루 기준의 초 값을 나타냅니다. |
| SECOND_OF_MINUTE | 분(minute) 내의 초 값을 나타냅니다. |
필드 값 조회 방법
LocalTime과 같은 날짜-시간 클래스의 get() 또는 getLong() 메서드에 Temporal 필드를 매개변수로 전달하면, 현재 객체에서 해당 필드의 값을 손쉽게 가져올 수 있습니다.
예제 코드
import java.time.LocalTime;
import java.time.temporal.ChronoField;
public class Demo {
public static void main(String args[]) {
// LocalTime 클래스 인스턴스 생성
LocalTime lTime = LocalTime.now();
System.out.println(lTime);
int field = lTime.get(ChronoField.CLOCK_HOUR_OF_AMPM);
System.out.println("오전/오후 기준 시: " + field);
field = lTime.get(ChronoField.AMPM_OF_DAY);
System.out.println("오전 또는 오후: " + field);
field = lTime.get(ChronoField.CLOCK_HOUR_OF_DAY);
System.out.println("하루의 시: " + field);
long epoch = lTime.getLong(ChronoField.MINUTE_OF_DAY);
System.out.println("하루의 분: " + epoch);
field = lTime.get(ChronoField.MINUTE_OF_HOUR);
System.out.println("시간 내의 분: " + field);
field = lTime.get(ChronoField.SECOND_OF_DAY);
System.out.println("하루의 초: " + field);
field = lTime.get(ChronoField.SECOND_OF_MINUTE);
System.out.println("분 내의 초: " + field);
}
}
실행 결과
17:02:46.294
오전/오후 기준 시: 5
오전 또는 오후: 1
하루의 시: 17
하루의 분: 1022
시간 내의 분: 2
하루의 초: 61366
분 내의 초: 46
실행 결과를 살펴보면 현재 시각이 17:02:46일 때, CLOCK_HOUR_OF_AMPM은 오후 5시를 의미하는 5, AMPM_OF_DAY는 오후를 뜻하는 1, CLOCK_HOUR_OF_DAY는 24시간제 기준 17을 반환하는 것을 확인할 수 있습니다. 이처럼 ChronoField의 다양한 필드를 활용하면 원하는 단위의 시간 정보를 간편하게 추출할 수 있습니다.