날짜-시간 필드(Temporal Field)란 '연 중 몇 번째 월', '시 중 몇 번째 분'과 같이 날짜와 시간을 구성하는 개별 요소를 의미합니다. 자바에서는 이러한 필드를 TemporalField 인터페이스로 표현하며, java.time.temporal.ChronoField 클래스(정확히는 열거형)가 이 인터페이스를 구현하여 표준 날짜-시간 필드 집합을 제공합니다.
ChronoField 클래스가 지원하는 날짜 관련 주요 필드
다음은 ChronoField 클래스에서 지원하는 대표적인 날짜 관련 필드 목록입니다.
| 필드 | 설명 |
|---|---|
| ALIGNED_DAY_OF_WEEK_IN_MONTH | 월 단위로 정렬했을 때, 해당 날짜가 속한 주 안에서의 요일 순번을 나타냅니다. |
| ALIGNED_DAY_OF_WEEK_IN_YEAR | 연 단위로 정렬했을 때, 해당 날짜가 속한 주 안에서의 요일 순번을 나타냅니다. |
| ALIGNED_WEEK_OF_MONTH | 월 기준으로 정렬했을 때 몇 번째 주인지 나타냅니다. |
| ALIGNED_WEEK_OF_YEAR | 연 기준으로 정렬했을 때 몇 번째 주인지 나타냅니다. |
| DAY_OF_MONTH | 월 기준 일(1~31)을 나타냅니다. |
| DAY_OF_WEEK | 요일을 나타냅니다. ISO-8601 기준으로 월요일이 1, 일요일이 7입니다. |
| DAY_OF_YEAR | 연 중 몇 번째 날(1~365 또는 366)인지 나타냅니다. |
| EPOCH_DAY | 1970년 1월 1일(에포크)을 기준으로 경과한 일 수를 나타냅니다. |
| ERA | 시대(연호)를 나타냅니다. 서기(CE)는 1입니다. |
| YEAR | 연도를 나타냅니다. |
| YEAR_OF_ERA | 시대 기준 연도를 나타냅니다. |
get() / getLong() 메서드로 필드 값 조회하기
LocalDate, LocalDateTime, LocalTime 등의 날짜-시간 클래스는 get() 또는 getLong() 메서드에 날짜-시간 필드를 인자로 전달하여, 현재 객체에서 해당 필드의 값을 가져올 수 있습니다. 일반적으로 int 범위 안의 값이라면 get()을, 더 큰 범위의 값이라면 getLong()을 사용하는 것이 좋습니다.
예제 1: LocalDate에서 날짜 필드 조회하기
import java.time.LocalDate;
import java.time.temporal.ChronoField;
public class Demo {
public static void main(String args[]) {
// LocalDate 클래스 인스턴스 생성
LocalDate lDate = LocalDate.now();
int field = lDate.get(ChronoField.DAY_OF_MONTH);
System.out.println("Day of month: " + field);
field = lDate.get(ChronoField.DAY_OF_WEEK);
System.out.println("Day of week: " + field);
field = lDate.get(ChronoField.DAY_OF_YEAR);
System.out.println("Day of year: " + 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("Aligned day of week in month: " + field);
field = lDate.get(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR);
System.out.println("Aligned day of week in year: " + field);
field = lDate.get(ChronoField.ERA);
System.out.println("Era: " + field);
}
}
실행 결과
Day of month: 11 Day of week: 3 Day of year: 316 Epoch day: 18577 Aligned day of week in month: 4 Aligned day of week in year: 1 Era: 1
위 결과에서 DAY_OF_WEEK가 3이면 수요일을 의미하고, ERA가 1이면 서기(CE)임을 뜻합니다.
예제 2: Year, Month, DayOfWeek에서 필드 조회하기
import java.time.DayOfWeek;
import java.time.LocalTime;
import java.time.Month;
import java.time.Year;
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 = Year.of(2019).get(ChronoField.YEAR);
System.out.println("Year: " + field);
field = Month.of(8).get(ChronoField.MONTH_OF_YEAR);
System.out.println("Month: " + field);
field = DayOfWeek.of(3).get(ChronoField.DAY_OF_WEEK);
System.out.println("Day of week: " + field);
}
}
실행 결과
20:01:43.171 Year: 2019 Month: 8 Day of week: 3
정리
자바의 날짜-시간 API(java.time)에서 날짜와 시간의 각 구성 요소는 TemporalField로 추상화되며, ChronoField가 표준 필드를 제공합니다. get()/getLong() 메서드를 활용하면 특정 날짜의 연·월·일·요일 등 원하는 필드 값을 손쉽게 조회할 수 있어 날짜 처리 로직을 깔끔하게 작성할 수 있습니다.