Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 날짜-시간 필드(TemporalField)란? ChronoField로 날짜 정보 조회하기

날짜-시간 필드(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_DAY1970년 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() 메서드를 활용하면 특정 날짜의 연·월·일·요일 등 원하는 필드 값을 손쉽게 조회할 수 있어 날짜 처리 로직을 깔끔하게 작성할 수 있습니다.