BE/Java

chronofield

baek-dev 2025. 5. 25. 13:04

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