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

Java TemporalField(시간 필드)란? 날짜·시간 값 조회 방법과 예제

시간 필드(Temporal Field)란?

시간 필드(Temporal Field)란 날짜와 시간을 구성하는 개별 단위를 의미합니다. 예를 들어 '연 중 몇 번째 달(month-of-year)', '하루 중 몇 시(hour-of-day)' 같은 값들이 모두 시간 필드에 해당합니다.

자바에서는 이러한 필드를 TemporalField 인터페이스로 추상화하며, 표준 필드 정의를 모아 둔 ChronoField 열거형(enum)이 이 인터페이스를 구현합니다.

LocalDateTime 클래스의 get() 또는 getLong() 메서드는 시간 필드를 매개변수로 받아, 현재 객체가 가진 해당 필드의 값을 반환합니다. 두 메서드의 차이는 반환 타입뿐입니다.

  • get(TemporalField) — 값을 int 타입으로 반환
  • getLong(TemporalField) — 값을 long 타입으로 반환

날짜 관련 시간 필드 조회 예제

다음 예제는 하나의 날짜에서 날짜(date)와 관련된 시간 필드 값들을 조회하는 방법을 보여줍니다.

import java.time.LocalDateTime;
import java.time.temporal.ChronoField;

public class Demo {
    public static void main(String args[]) {
        // LocalDateTime 클래스 인스턴스 생성
        LocalDateTime lDate = LocalDateTime.now();

        int field = lDate.get(ChronoField.DAY_OF_MONTH);
        System.out.println("일(월 기준): " + field);

        field = lDate.get(ChronoField.DAY_OF_WEEK);
        System.out.println("요일(ISO 기준, 월=1): " + field);

        field = lDate.get(ChronoField.DAY_OF_YEAR);
        System.out.println("일(연 기준): " + 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("월 기준 정렬 요일: " + field);

        field = lDate.get(ChronoField.ALIGNED_DAY_OF_WEEK_IN_YEAR);
        System.out.println("연 기준 정렬 요일: " + field);

        field = lDate.get(ChronoField.ERA);
        System.out.println("시대(ERA): " + field);
    }
}

실행 결과:

일(월 기준): 25
요일(ISO 기준, 월=1): 5
일(연 기준): 237
에포크 일(Epoch Day): 17403
월 기준 정렬 요일: 4
연 기준 정렬 요일: 6
시대(ERA): 1

주요 날짜 필드 의미

필드설명
DAY_OF_MONTH달 기준 일(1~31)
DAY_OF_WEEK요일(ISO-8601 기준, 월요일=1 ~ 일요일=7)
DAY_OF_YEAR연도 기준 일(1~365 또는 366)
EPOCH_DAY1970-01-01을 0으로 하는 경과 일 수
ALIGNED_DAY_OF_WEEK_IN_MONTH달의 첫날을 주의 시작으로 보았을 때의 요일
ALIGNED_DAY_OF_WEEK_IN_YEAR연도의 첫날을 주의 시작으로 보았을 때의 요일
ERA시대(서기 CE = 1, 기원전 BCE = 0)

시간 관련 시간 필드 조회 예제

다음 예제는 시간(time)과 관련된 시간 필드 값들을 조회하는 방법을 보여줍니다.

import java.time.LocalDateTime;
import java.time.temporal.ChronoField;

public class CreateDateTime {
    public static void main(String args[]) {
        // LocalDateTime 클래스 인스턴스 생성
        LocalDateTime lDateTime = LocalDateTime.now();
        System.out.println(lDateTime);

        int field = lDateTime.get(ChronoField.CLOCK_HOUR_OF_AMPM);
        System.out.println("오전/오후 시각(1~12): " + field);

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

        field = lDateTime.get(ChronoField.CLOCK_HOUR_OF_DAY);
        System.out.println("하루 기준 시각(1~24): " + field);

        long epoch = lDateTime.getLong(ChronoField.MINUTE_OF_DAY);
        System.out.println("하루 기준 분: " + epoch);

        field = lDateTime.get(ChronoField.MINUTE_OF_HOUR);
        System.out.println("시간 내 분(0~59): " + field);

        field = lDateTime.get(ChronoField.SECOND_OF_DAY);
        System.out.println("하루 기준 초: " + field);

        field = lDateTime.get(ChronoField.SECOND_OF_MINUTE);
        System.out.println("분 내 초(0~59): " + field);
    }
}

실행 결과:

2020-11-11T14:58:22.680
오전/오후 시각(1~12): 2
오전(0) 또는 오후(1): 1
하루 기준 시각(1~24): 14
하루 기준 분: 898
시간 내 분(0~59): 58
하루 기준 초: 53902
분 내 초(0~59): 22

정리

자바의 날짜·시간 API(java.time)에서 시간 필드는 날짜와 시간 데이터를 세밀하게 조회하고 조작할 수 있게 해주는 핵심 개념입니다. ChronoField가 제공하는 다양한 상수를 get(), getLong() 메서드와 함께 사용하면 복잡한 계산 없이도 원하는 단위의 날짜·시간 값을 간단히 얻을 수 있습니다.