ChronoField 는 Java 8 이상에서 날짜와 시간의 각 필드를 직접 지정하고 조작할 수 있게 해주는 열거형(Enum) 임.
ChronoField – 날짜/시간의 필드 조작용 Enum
ChronoField 는 java.time.temporal 패키지에 포함된 Enum으로,
날짜 및 시간의 세부 항목(예: 연도, 월, 일, 시, 분 등)을 직접 다루기 위한 필드 정의 집합임.
각 필드는 TemporalField 인터페이스를 구현하며, LocalDate, LocalTime, ZonedDateTime 등에서 직접 접근 및 수정 가능함.
1. 왜 ChronoField를 사용하는가?
Java의 LocalDate, LocalTime, ZonedDateTime 등은 내부적으로 다양한 필드 단위 정보를 포함함.
이 정보를 직접적으로 get/set 하고자 할 때 ChronoField 를 사용하면 정밀하게 조작할 수 있음.
2. 주요 ChronoField 목록
필드명 | 설명 |
YEAR | 연도 |
MONTH_OF_YEAR | 월 (1~12) |
DAY_OF_MONTH | 월 기준 날짜 (1~31) |
DAY_OF_WEEK | 요일 (1:월 ~ 7:일) |
DAY_OF_YEAR | 1년 기준 일수 (1~365 또는 366) |
HOUR_OF_DAY | 시간 (0~23) |
MINUTE_OF_HOUR | 분 (0~59) |
SECOND_OF_MINUTE | 초 (0~59) |
MILLI_OF_SECOND | 밀리초 (0~999) |
EPOCH_DAY | 1970-01-01 이후의 총 일수 |
INSTANT_SECONDS | 에포크 이후 초 단위 시간 |
NANO_OF_SECOND | 초 기준 나노초 |
CLOCK_HOUR_OF_DAY | 1~24 시간제 표현 (0 없음) |
3. ChronoField 사용 예시
① 날짜에서 필드 추출
LocalDate date = LocalDate.of(2025, 5, 21);
int year = date.get(ChronoField.YEAR); // 2025
int month = date.get(ChronoField.MONTH_OF_YEAR); // 5
int day = date.get(ChronoField.DAY_OF_MONTH); // 21
② 날짜 필드 수정
LocalDate updated = date.with(ChronoField.DAY_OF_MONTH, 1); // 5월 1일로 변경
→ with() 메서드를 사용하면, 특정 필드를 새 값으로 대체하여 새로운 객체를 반환함
4. ChronoField vs ChronoUnit
항목 | ChronoField | ChronoUnit |
의미 | 날짜/시간의 세부 구성 요소를 가리킴 | 연산(덧셈/뺄셈/차이)을 위한 시간 단위 |
예시 | YEAR, MONTH_OF_YEAR, HOUR_OF_DAY | YEARS, MONTHS, DAYS |
주요 메서드 | get(), with() | plus(), minus(), between() |
5. 실무 활용 예시
사례 | 설명 |
날짜 필드별 분리 저장 | 연도, 월, 일을 따로 추출하여 DB에 저장 |
날짜 계산 후 특정 필드만 수정 | 날짜 계산 후 무조건 1일로 조정할 때 |
커스텀 포맷 변환 시 사용 | 요일(DAY_OF_WEEK)을 숫자로 가져와 한글 요일 매핑 등 |
CSV 파일 날짜 필드 분리 | 날짜 스트링에서 필드별로 숫자 추출 시 유용함 |
6. 주의사항
- ChronoField 를 사용할 때는 해당 Temporal 객체가 해당 필드를 지원하는지 확인 필요
- 예를 들어 LocalDate 는 HOUR_OF_DAY 를 지원하지 않음 → 예외 발생함
LocalDate date = LocalDate.now();
int hour = date.get(ChronoField.HOUR_OF_DAY); // UnsupportedTemporalTypeException 발생
→ 해당 필드가 지원되는 객체에서만 사용해야 함
정리
ChronoField 는 Java 날짜/시간 API에서 각 시간 단위를 세부적으로 표현하고 조작할 수 있게 해주는 열거형 필드 집합임.
get() 또는 with() 과 함께 사용하여 날짜/시간을 구성하는 연도, 월, 일, 시, 분, 초 등을 세밀하게 제어할 수 있음.
ChronoUnit이 "얼마만큼"의 연산을 위한 단위라면, ChronoField는 "무엇을" 조작할지 정의하는 필드임.
출처 : ChatGPT
'BE > Java' 카테고리의 다른 글
DateTimeFormatter.ofPattern (0) | 2025.05.27 |
---|---|
temporalAdjusters (0) | 2025.05.26 |
chronounit (0) | 2025.05.24 |
BiConsumer (0) | 2025.05.18 |
[Java] ArrayDeque (0) | 2025.04.02 |