시간 필드(Temporal Field)란?
시간 필드(Temporal Field)란 날짜와 시간을 구성하는 개별 단위를 의미합니다. 예를 들어 '연 중 몇 번째 달(month-of-year)', '하루 중 몇 시(hour-of-day)' 같은 값들이 모두 시간 필드에 해당합니다.
자바에서는 이러한 필드를 TemporalField 인터페이스로 추상화하며, 표준 필드 정의를 모아 둔 ChronoField 열거형(enum)이 이 인터페이스를 구현합니다.
LocalDateTime 클래스의 get() 또는 getLong() 메서드는 시간 필드를 매개변수로 받아, 현재 객체가 가진 해당 필드의 값을 반환합니다. 두 메서드의 차이는 반환 타입뿐입니다.
get(TemporalField)— 값을 int 타입으로 반환getLong(TemporalField)— 값을 long 타입으로 반환
날짜 관련 시간 필드 조회 예제
다음 예제는 하나의 날짜에서 날짜(date)와 관련된 시간 필드 값들을 조회하는 방법을 보여줍니다.
import java.time.LocalDateTime;
import java.time.temporal.ChronoField;
public class Demo {
public static void main(String args[]) {
// LocalDateTime 클래스 인스턴스 생성
LocalDateTime lDate = LocalDateTime.now();
int field = lDate.get(ChronoField.DAY_OF_MONTH);
System.out.println("일(월 기준): " + field);
field = lDate.get(ChronoField.DAY_OF_WEEK);
System.out.println("요일(ISO 기준, 월=1): " + field);
field = lDate.get(ChronoField.DAY_OF_YEAR);
System.out.println("일(연 기준): " + field);
long epoch = lDate.getLong(ChronoField.EPOCH_DAY);
System.out.println("에포크 일(Epoch Day): " + epoch);
field = lDate.get(ChronoField.ALIGNED_DAY_OF_WEEK_IN_MONTH);
System.out.println("월 기준 정렬 요일: " + field);
field = lDate.get(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR);
System.out.println("연 기준 정렬 요일: " + field);
field = lDate.get(ChronoField.ERA);
System.out.println("시대(ERA): " + field);
}
}
실행 결과:
일(월 기준): 25
요일(ISO 기준, 월=1): 5
일(연 기준): 237
에포크 일(Epoch Day): 17403
월 기준 정렬 요일: 4
연 기준 정렬 요일: 6
시대(ERA): 1
주요 날짜 필드 의미
| 필드 | 설명 |
|---|---|
| DAY_OF_MONTH | 달 기준 일(1~31) |
| DAY_OF_WEEK | 요일(ISO-8601 기준, 월요일=1 ~ 일요일=7) |
| DAY_OF_YEAR | 연도 기준 일(1~365 또는 366) |
| EPOCH_DAY | 1970-01-01을 0으로 하는 경과 일 수 |
| ALIGNED_DAY_OF_WEEK_IN_MONTH | 달의 첫날을 주의 시작으로 보았을 때의 요일 |
| ALIGNED_DAY_OF_WEEK_IN_YEAR | 연도의 첫날을 주의 시작으로 보았을 때의 요일 |
| ERA | 시대(서기 CE = 1, 기원전 BCE = 0) |
시간 관련 시간 필드 조회 예제
다음 예제는 시간(time)과 관련된 시간 필드 값들을 조회하는 방법을 보여줍니다.
import java.time.LocalDateTime;
import java.time.temporal.ChronoField;
public class CreateDateTime {
public static void main(String args[]) {
// LocalDateTime 클래스 인스턴스 생성
LocalDateTime lDateTime = LocalDateTime.now();
System.out.println(lDateTime);
int field = lDateTime.get(ChronoField.CLOCK_HOUR_OF_AMPM);
System.out.println("오전/오후 시각(1~12): " + field);
field = lDateTime.get(ChronoField.AMPM_OF_DAY);
System.out.println("오전(0) 또는 오후(1): " + field);
field = lDateTime.get(ChronoField.CLOCK_HOUR_OF_DAY);
System.out.println("하루 기준 시각(1~24): " + field);
long epoch = lDateTime.getLong(ChronoField.MINUTE_OF_DAY);
System.out.println("하루 기준 분: " + epoch);
field = lDateTime.get(ChronoField.MINUTE_OF_HOUR);
System.out.println("시간 내 분(0~59): " + field);
field = lDateTime.get(ChronoField.SECOND_OF_DAY);
System.out.println("하루 기준 초: " + field);
field = lDateTime.get(ChronoField.SECOND_OF_MINUTE);
System.out.println("분 내 초(0~59): " + field);
}
}
실행 결과:
2020-11-11T14:58:22.680
오전/오후 시각(1~12): 2
오전(0) 또는 오후(1): 1
하루 기준 시각(1~24): 14
하루 기준 분: 898
시간 내 분(0~59): 58
하루 기준 초: 53902
분 내 초(0~59): 22
정리
자바의 날짜·시간 API(java.time)에서 시간 필드는 날짜와 시간 데이터를 세밀하게 조회하고 조작할 수 있게 해주는 핵심 개념입니다. ChronoField가 제공하는 다양한 상수를 get(), getLong() 메서드와 함께 사용하면 복잡한 계산 없이도 원하는 단위의 날짜·시간 값을 간단히 얻을 수 있습니다.