[Java] 날짜와 시간의 인터페이스

Yujeong·2024년 6월 16일
0

Java

목록 보기
17/22
post-thumbnail

시각과 기간의 인터페이스

날짜와 시간은 특정 시점의 시간(시각)과 시간의 간격(기간)으로 나눌 수 있다.
이에 따라, 인터페이스도 두 종류로 나뉜다.

1. 특정 시점의 시간

  • TemporalAccessor 인터페이스
    • 날짜와 시간을 읽기 위한 기본 인터페이스 (읽기 전용)
    • 특정 시점의 날짜와 시간 정보를 읽을 수 있는 기능 제공
  • Temporal 인터페이스
    • 날짜와 시간을 조작하기 위한 기능 제공 (읽기, 쓰기 제공)
    • 날짜와 시간을 변경하거나 조정 가능

2. 시간의 간격

  • TemporalAmount 인터페이스
    • 시간의 간격
    • 날짜와 시간 객체에 적용하여 그 객체를 조정 가능
      즉, 일정 날짜에 일정 기간을 더하거나 빼기 가능

시간의 단위와 시간 필드의 인터페이스

시간의 단위를 뜻하는 TemporalUnit(ChronoUnit)과 시간의 각 필드를 의미하는 TemporalField(ChronField) 인터페이스가 있다.

1. 시간의 단위 - ChronoUnit

  • TemporalUnit 인터페이스
    • 날짜와 시간을 측정하는 단위
    • 구현: java.time.temporal.ChronoUnit 열거형
  • ChronoUnit
    • 다양한 시간 단위 제공
    • 시간의 단위 하나하나를 나타냄

시간 단위

ChronoUnit설명
NANOS나노초
MICROS마이크로초
MILLIS밀리초
SECONDS
MINUTES
HOURS시간

날짜 단위

ChronoUnit설명
HAFL_DAYS반일
DAYS
WEEKS
MONTHS
YEARS
DECADES10년
CENTURIES세기
MILLENNIA1000년

기타

ChronoUnit설명
ERAS시대
FOREVER무한대

ChronoUnit 주요 메서드

메서드설명
between(Temporal startInclusive, Temporal endExclusive)두 Temporal 객체 간의 시간 단위 차이 계산
getDuration()해당 시간 단위의 기본 Duration 반환
isDateBased()이 시간 단위가 날짜 기반인지 여부 반환
isTimeBased()이 시간 단위가 시간 기반인지 여부 반환
isSupportedBy(Temporal)Temporal 객체가 현재 ChronoUnit 단위를 지원하는지 여부 반환
addTo(Temporal temporal, long amount)지정된 Temporal 객체에 지정된 양의 시간 단위 추가

ChronoUnit 사용해보기

public class ChronoUnitMain {

	public static void main(String[] args) {
    	// 1. ChronoUnit value 확인
        System.out.println("====ChronoUnit values====");
        ChronoUnit[] values = ChronoUnit.values();
        for (ChronoUnit value : values) {
            System.out.println(value);
        }
        System.out.println("=========================");
        
        // 2. 차이
        LocalTime time1 = LocalTime.of(15, 30, 10);
        LocalTime time2 = LocalTime.of(16, 30, 20);
        
        long secondsBt = ChronoUnit.SECONDS.between(time1, time2);
        System.out.println("seconds between: " + secondsBt);
        
        long minutesBt = ChronoUnit.MINUTES.between(time1, time2);
        System.out.println("minutes between " + minutesBt);
        
        // 3. 계산
        LocalTime time = LocalTime.now();
        LocalTime plusMinute = time.plus(30, ChronoUnit.MINUTES);
        System.out.println("plus minutes " + plusMinute);
        
        LocalTime plusSecond = time.plus(10, ChronoUnit.SECONDS);
        System.out.println("plus seconds " + plusSecond);
    }
}
====ChronoUnit values====
Nanos
Micros
Millis
Seconds
Minutes
Hours
HalfDays
Days
Weeks
Months
Years
Decades
Centuries
Millennia
Eras
Forever
=========================
seconds between: 3610
minutes between 60
plus minutes 16:14:50.401521
plus seconds 15:45:00.401521

2. 시간의 필드 - ChronoField

  • TemporalField 인터페이스
    • 날짜와 시간을 타나냄
    • 구현: java.time.temporal.ChronoField 열거형
  • ChronoField
    - 날짜와 시간의 특정 부분 나타냄
    • 연도, 월, 일, 시간, 분 등

연도 관련 필드

필드명설명
ERA연대, AD 또는 BC
YEAR_OF_ERA연대 내의 연도
YEAR연도
EPOCH_DAY1970-01-01부터 일 수

월 관련 필드

필드명설명
MONTH_OF_YEAR
PROLEPTIC_MONTH연도를 월로 확장한 값

주, 일 관련 필드

필드명설명
DAY_OF_WEEK요일 (월요일=1)
ALIGNED_DAY_OF_WEEK_IN_MONTH월의 첫 번째 요일을 기준으로 정렬된 요일
ALIGNED_DAY_OF_WEEK_IN_YEAR연의 첫 번째 요일을 기준으로 정렬된 요일
DAY_OF_MONTH월의 일
DAY_OF_YEAR연의 일
EPOCH_DAY1970-01-01부터의 일 수

시간 관련 필드

필드명설명
HOUR_OF_DAY시간 (0-23)
CLOCK_HOUR_OF_DAY오전 오후 시간 (0-11)
HOUR_OF_AMPM오전/오후 세계 시간 (1-12)
MINUTE_OF_HOUR
SECOND_OF_MINUTE
NANO_OF_SECOND초의 나노초 (0-999,999,999)
MICRO_OF_SECOND초의 마이크로초 (0-999,999)
MILLI_OF_SECOND초의 밀리초 (0-999)

기타 필드

필드명설명
AMPM_OF_DAY하루의 AM/PM 부분
INSTANT_SECONDS초를 기준으로 한 시간
OFFSET_SECONDSUTC/GMT에서의 시간 오프셋 초

ChronoField 주요 메서드

메서드설명
getBaseUnit()이 필드의 기본 단위 반환
getDisplayName()이 필드의 표시 이름 반환
getRangeUnit()이 필드의 범위 단위 반환
isDateBased()이 필드가 날짜 기반 필드인지 여부 반환
isTimeBased()이 필드가 시간 기반 필드인지 여부 반환
range()이 필드의 유효 범위 반환

ChronoField 사용해보기

public class ChronoFieldMain {

	public static void main(String[] args) 
        System.out.println("== ChronoField values ==");
        ChronoField[] values = ChronoField.values();
        for (ChronoField value : values) {
            System.out.println(value + ", range: " + value.range());
        }
        System.out.println("========================");

        System.out.println("MONTH_OF_YEAR.range() = " + ChronoField.MONTH_OF_YEAR.range());
        System.out.println("DAY_OF_MONTH.range() = " + ChronoField.DAY_OF_MONTH.range());
    }
}
== ChronoField values ==
NanoOfSecond, range: 0 - 999999999
NanoOfDay, range: 0 - 86399999999999
...
InstantSeconds, range: -9223372036854775808 - 9223372036854775807
OffsetSeconds, range: -64800 - 64800
========================
MONTH_OF_YEAR.range() = 1 - 12
DAY_OF_MONTH.range() = 1 - 28/31

참고
Interface TemporalAccessor
Interface Temporal
Interface TemporalAmount
Enum Class ChronoUnit
Enum Class ChronoField

김영한의 실전 자바 - 중급 1편

profile
공부 기록

0개의 댓글

관련 채용 정보