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

Java의 시간(Temporal) 필드란? ChronoField 완벽 정리

시간 필드(temporal field)란 날짜와 시간을 구성하는 개별 요소를 의미합니다. 예를 들어 '연중 몇 번째 달', '몇 시' 같은 값들이 대표적입니다. Java에서는 이러한 필드를 TemporalField 인터페이스로 표현하며, ChronoField 클래스가 이 인터페이스를 구현하여 표준 필드 집합을 제공합니다.

ChronoField에서 지원하는 시간 관련 필드

ChronoField 클래스는 아래와 같은 다양한 시간 관련 필드를 지원합니다.

필드설명
CLOCK_HOUR_OF_AMPM오전/오후(am/pm) 기준의 시계 시간(1~12)을 나타냅니다.
AMPM_OF_DAY하루 중 오전(AM)인지 오후(PM)인지를 나타냅니다. (오전: 0, 오후: 1)
CLOCK_HOUR_OF_DAY하루의 시계 시간(1~24)을 나타냅니다.
HOUR_OF_AMPM오전/오후 기준의 시간(0~11)을 나타냅니다.
HOUR_OF_DAY하루의 시간(0~23)을 나타냅니다.
INSTANT_SECONDS에포크(epoch) 기준 초 단위의 순간 값을 나타냅니다.
MICRO_OF_DAY하루 기준의 마이크로초 값을 나타냅니다.
MICRO_OF_SECOND초 기준의 마이크로초 값을 나타냅니다.
MILLI_OF_DAY하루 기준의 밀리초 값을 나타냅니다.
MILLI_OF_SECOND초 기준의 밀리초 값을 나타냅니다.
MINUTE_OF_DAY하루 기준의 분 값을 나타냅니다.
MINUTE_OF_HOUR시간(hour) 내의 분 값을 나타냅니다.
MONTH_OF_YEAR연중 몇 번째 달인지 나타냅니다.
NANO_OF_DAY하루 기준의 나노초 값을 나타냅니다.
NANO_OF_SECOND초 기준의 나노초 값을 나타냅니다.
OFFSET_SECONDSUTC/그리니치로부터의 시간 오프셋(초)을 나타냅니다.
PROLEPTIC_MONTH역산월(proleptic month), 즉 연도를 개월 수로 확장한 값을 나타냅니다.
SECOND_OF_DAY하루 기준의 초 값을 나타냅니다.
SECOND_OF_MINUTE분(minute) 내의 초 값을 나타냅니다.

필드 값 조회 방법

LocalTime과 같은 날짜-시간 클래스의 get() 또는 getLong() 메서드에 Temporal 필드를 매개변수로 전달하면, 현재 객체에서 해당 필드의 값을 손쉽게 가져올 수 있습니다.

예제 코드

import java.time.LocalTime;
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 = lTime.get(ChronoField.CLOCK_HOUR_OF_AMPM);
      System.out.println("오전/오후 기준 시: " + field);

      field = lTime.get(ChronoField.AMPM_OF_DAY);
      System.out.println("오전 또는 오후: " + field);

      field = lTime.get(ChronoField.CLOCK_HOUR_OF_DAY);
      System.out.println("하루의 시: " + field);

      long epoch = lTime.getLong(ChronoField.MINUTE_OF_DAY);
      System.out.println("하루의 분: " + epoch);

      field = lTime.get(ChronoField.MINUTE_OF_HOUR);
      System.out.println("시간 내의 분: " + field);

      field = lTime.get(ChronoField.SECOND_OF_DAY);
      System.out.println("하루의 초: " + field);

      field = lTime.get(ChronoField.SECOND_OF_MINUTE);
      System.out.println("분 내의 초: " + field);
   }
}

실행 결과

17:02:46.294
오전/오후 기준 시: 5
오전 또는 오후: 1
하루의 시: 17
하루의 분: 1022
시간 내의 분: 2
하루의 초: 61366
분 내의 초: 46

실행 결과를 살펴보면 현재 시각이 17:02:46일 때, CLOCK_HOUR_OF_AMPM은 오후 5시를 의미하는 5, AMPM_OF_DAY는 오후를 뜻하는 1, CLOCK_HOUR_OF_DAY는 24시간제 기준 17을 반환하는 것을 확인할 수 있습니다. 이처럼 ChronoField의 다양한 필드를 활용하면 원하는 단위의 시간 정보를 간편하게 추출할 수 있습니다.