[TIL 67일차] 자바 복습 정리 18

이건·2024년 8월 25일

자바에서 날짜와 시간 라이브러리가 필요한 이유

자바에서 날짜와 시간 라이브러리가 필요한 이유는 여러 가지가 있다.

  1. 날짜와 시간 차이 계산: 날짜와 시간 사이의 차이를 계산하는 것은 다양한 애플리케이션에서 필수적이다. 예를 들어, 두 날짜 간의 일수 차이를 계산하거나 두 시각 간의 경과 시간을 측정하는 데 사용된다. java.time 패키지의 DurationPeriod 클래스를 이용하면 쉽게 구현할 수 있다.

  2. 윤년 계산: 윤년은 4년에 한 번 발생하지만, 100년마다 발생하지 않으며, 400년마다 다시 발생하는 복잡한 규칙이 있다. 자바의 날짜 및 시간 라이브러리를 사용하면 이러한 규칙을 쉽게 적용하여 윤년을 판단할 수 있다. java.time.Year 클래스의 isLeap() 메소드를 활용하면 간단하게 윤년 여부를 확인할 수 있다.

  3. 일광 절약 시간(Daylight Saving Time, DST) 변환: 특정 지역에서는 일광 절약 시간을 통해 여름철에 시간을 조정한다. 자바의 날짜 및 시간 API는 타임존 정보를 포함하고 있어, DST 전환을 자동으로 처리할 수 있다. ZoneIdZonedDateTime 클래스를 사용하면 DST 변환을 쉽게 다룰 수 있다.

  4. 타임존 계산: 전 세계의 다양한 시간대에 따라 시간 계산이 필요한다. 자바에서는 ZoneId 클래스를 통해 다양한 타임존을 지원하며, 특정 지역의 현재 시간을 쉽게 계산할 수 있다. ZonedDateTime 클래스를 사용하면 타임존을 고려한 날짜 및 시간을 다룰 수 있다.

이와 같이, 자바의 날짜와 시간 라이브러리는 복잡한 날짜 및 시간 관련 작업을 간편하게 처리할 수 있도록 도와준다. 이를 통해 개발자는 시간대, 윤년, DST 등을 신경 쓰지 않고 애플리케이션의 비즈니스 로직에 집중할 수 있다.

LocalDate, LocalTime, LocalDateTime

LocalDate, LocalTime, LocalDateTime은 자바의 java.time 패키지에서 제공하는 날짜와 시간 관련 클래스다. 각각의 클래스는 다음과 같은 용도로 사용된다.

  1. LocalDate:

    • 날짜 정보를 표현하는 클래스다. 연도, 월, 일 정보를 포함하지만 시간 정보는 포함하지 않다.
    • 예를 들어, 특정 날짜를 나타낼 때 사용된다.
    • 사용 예시:
      LocalDate today = LocalDate.now(); // 현재 날짜
      LocalDate specificDate = LocalDate.of(2024, 8, 25); // 2024년 8월 25일
  2. LocalTime:

    • 시간 정보를 표현하는 클래스다. 시, 분, 초 정보를 포함하지만 날짜 정보는 포함하지 않다.
    • 특정 시간을 나타낼 때 사용된다.
    • 사용 예시:
      LocalTime now = LocalTime.now(); // 현재 시간
      LocalTime specificTime = LocalTime.of(14, 30, 0); // 14시 30분 0초
  3. LocalDateTime:

    • 날짜와 시간 정보를 모두 포함하는 클래스다. 연도, 월, 일, 시, 분, 초 정보를 모두 포함하며, 타임존 정보는 포함하지 않는다.
    • 특정 날짜와 시간을 동시에 나타낼 때 사용된다.
    • 사용 예시:
      LocalDateTime now = LocalDateTime.now(); // 현재 날짜와 시간
      LocalDateTime specificDateTime = LocalDateTime.of(2024, 8, 25, 14, 30); // 2024년 8월 25일 14시 30분

이 세 가지 클래스는 날짜와 시간 관련 작업을 보다 간편하고 명확하게 처리할 수 있도록 도와주며, 불변 객체로 설계되어 있어 스레드 안전성을 제공한다. 각 클래스는 다양한 메소드를 제공하여 날짜와 시간의 계산, 비교, 포맷팅 등을 쉽게 수행할 수 있다.

ZonedDateTime, OffsetDateTime

ZonedDateTimeOffsetDateTime은 자바의 java.time 패키지에서 제공하는 날짜와 시간 관련 클래스다. 이 두 클래스는 주로 타임존과 오프셋 정보를 다루는 데 사용된다. 각각의 특징은 다음과 같다.

  1. ZonedDateTime:

    • 날짜와 시간 정보를 포함하며, 특정 지역의 타임존 정보를 함께 저장한다.
    • ZonedDateTime은 시간대가 변경되는 경우에도 정확한 시간 표현이 가능하도록 설계되었다. 예를 들어, 여름철에 일광 절약 시간(DST)이 적용되는 경우도 자동으로 처리한다.
    • 사용 예시:
      ZonedDateTime zonedDateTime = ZonedDateTime.now(); // 현재 날짜와 시간, 기본 타임존 사용
      ZonedDateTime specificZonedDateTime = ZonedDateTime.of(2024, 8, 25, 14, 30, 0, 0, ZoneId.of("America/New_York")); // 특정 날짜와 시간, 뉴욕 타임존
  2. OffsetDateTime:

    • 날짜와 시간 정보를 포함하며, UTC(협정 세계시)로부터의 오프셋(시간 차이) 정보를 저장한다. 즉, 특정 타임존이 아니라 특정 오프셋을 기준으로 한다.
    • OffsetDateTime은 타임존에 대한 정보 없이 UTC와의 차이만을 가지고 있어, 특정 장소에 대한 시간 변화를 고려하지 않는다.
    • 사용 예시:
      OffsetDateTime offsetDateTime = OffsetDateTime.now(); // 현재 날짜와 시간, 기본 오프셋 사용
      OffsetDateTime specificOffsetDateTime = OffsetDateTime.of(2024, 8, 25, 14, 30, 0, 0, ZoneOffset.ofHours(-5)); // 특정 날짜와 시간, UTC-5

요약

  • ZonedDateTime은 특정 타임존에 대한 날짜와 시간을 나타내며, DST를 자동으로 처리한다.
  • OffsetDateTime은 UTC와의 오프셋을 기준으로 날짜와 시간을 나타내며, 타임존 정보는 포함하지 않는다.

두 클래스 모두 날짜와 시간 관련 작업을 보다 정밀하게 처리할 수 있도록 도와주며, 다양한 메소드를 통해 날짜와 시간의 계산, 비교, 포맷팅 등을 쉽게 수행할 수 있다.

Year, Month, YearMonth, MonthDay

Year, Month, YearMonth, MonthDay는 자바의 java.time 패키지에서 제공하는 날짜와 시간 관련 클래스다. 각각의 클래스는 특정한 날짜 정보를 표현하는 데 사용된다.

  1. Year:

    • 연도 정보를 표현하는 클래스다. 특정 연도를 나타내며, 월이나 일 정보는 포함하지 않는다.
    • 윤년 계산과 같은 연도 관련 기능을 제공한다.
    • 사용 예시:
      Year year = Year.now(); // 현재 연도
      Year specificYear = Year.of(2024); // 2024년
      boolean isLeap = specificYear.isLeap(); // 2024년이 윤년인지 여부 확인
  2. Month:

    • 월 정보를 표현하는 열거형(enum) 클래스다. 1월부터 12월까지의 월을 나타낸다.
    • 각 월에 대한 다양한 정보를 제공하며, 예를 들어, 특정 월의 일 수를 확인할 수 있다.
    • 사용 예시:
      Month month = Month.AUGUST; // 8월
      int daysInMonth = month.length(false); // 윤년이 아닐 때 8월의 일 수
  3. YearMonth:

    • 연도와 월 정보를 함께 표현하는 클래스다. 특정 연도와 월을 나타내며, 일 정보는 포함하지 않는다.
    • 특정 월의 일 수를 계산하는 데 유용하다.
    • 사용 예시:
      YearMonth yearMonth = YearMonth.now(); // 현재 연도와 월
      YearMonth specificYearMonth = YearMonth.of(2024, Month.AUGUST); // 2024년 8월
      int daysInMonth = specificYearMonth.lengthOfMonth(); // 2024년 8월의 일 수
  4. MonthDay:

    • 월과 일 정보를 표현하는 클래스다. 연도 정보는 포함하지 않으며, 특정 월의 특정 일자를 나타낸다.
    • 주로 생일이나 기념일과 같이 연도와 관계없이 반복되는 날짜를 표현하는 데 유용하다.
    • 사용 예시:
      MonthDay monthDay = MonthDay.now(); // 현재 월과 일
      MonthDay specificMonthDay = MonthDay.of(Month.AUGUST, 25); // 8월 25일

요약

  • Year: 연도 정보를 나타내며, 윤년 계산 등의 기능을 제공.
  • Month: 월 정보를 나타내는 열거형(enum)으로, 각 월의 일 수 등을 제공.
  • YearMonth: 연도와 월을 함께 표현하며, 특정 월의 일 수를 계산할 수 있음.
  • MonthDay: 연도 없이 월과 일만을 표현하며, 주로 반복되는 날짜를 나타냄.

이 클래스들은 날짜와 관련된 다양한 작업을 보다 쉽게 수행할 수 있도록 도와준다.

Instant

Instant는 자바의 java.time 패키지에서 제공하는 클래스 중 하나로, 특정 시점을 UTC(협정 세계시)를 기준으로 표현한다. Instant는 타임존이나 로컬 날짜와 시간 정보를 포함하지 않으며, 전 세계적으로 동일한 시점을 나타내는 데 사용된다.

주요 특징

  1. 시간의 표현:

    • Instant는 1970년 1월 1일 00:00:00 UTC부터의 경과 시간을 나노초 단위로 표현한다. 이는 UNIX 타임스탬프와 유사한다.
  2. 타임존의 독립성:

    • Instant는 타임존이나 오프셋에 의존하지 않기 때문에, 전 세계 어디에서나 동일한 시점으로 해석된다.
  3. 정확성:

    • 나노초 단위로 시간을 표현할 수 있어 매우 높은 정밀도를 제공한다.
  4. 일반적인 사용:

    • Instant는 이벤트의 타임스탬프, 로그 기록, 시간 비교 등의 작업에 유용하다.

사용 예시

import java.time.Instant;

public class Main {
    public static void main(String[] args) {
        // 현재 Instant 얻기
        Instant now = Instant.now();
        System.out.println("현재 Instant: " + now);
        
        // 특정 Instant 생성
        Instant specificInstant = Instant.ofEpochSecond(1609459200); // 2021-01-01T00:00:00Z
        System.out.println("특정 Instant: " + specificInstant);
        
        // Instant를 밀리초로 변환
        long millis = now.toEpochMilli();
        System.out.println("현재 Instant의 밀리초: " + millis);
        
        // Instant 비교
        boolean isAfter = now.isAfter(specificInstant);
        System.out.println("현재 Instant가 특정 Instant 이후인가? " + isAfter);
    }
}

요약

  • Instant는 UTC 기준으로 특정 시점을 표현하며, 타임존에 독립적이다.
  • 고정밀 나노초 단위로 시간을 표현할 수 있어, 다양한 시간 관련 작업에서 유용하게 사용된다.
  • 로그 기록, 이벤트 타임스탬프 등에서 자주 사용되며, 다른 날짜 및 시간 클래스와 함께 사용하여 더 복잡한 날짜 및 시간 연산을 수행할 수 있다.

PeriodDuration

PeriodDuration은 자바의 java.time 패키지에서 시간의 양을 표현하기 위해 사용되는 두 가지 클래스다. 이 두 클래스는 서로 다른 유형의 시간 간격을 다루며, 각각의 특징은 다음과 같다.

Period

  1. 정의:

    • Period는 연도, 월, 일 단위로 시간의 양을 표현한다. 주로 날짜 간의 차이를 나타내는 데 사용된다.
  2. 사용 예시:

    import java.time.LocalDate;
    import java.time.Period;
    
    public class Main {
        public static void main(String[] args) {
            LocalDate startDate = LocalDate.of(2020, 1, 1);
            LocalDate endDate = LocalDate.of(2023, 1, 1);
            
            Period period = Period.between(startDate, endDate);
            System.out.println("기간: " + period.getYears() + "년 " + period.getMonths() + "개월 " + period.getDays() + "일");
        }
    }
  3. 주요 메서드:

    • between(startDate, endDate): 두 날짜 간의 Period를 계산한다.
    • of(years, months, days): 특정 연도, 월, 일로 Period를 생성한다.

Duration

  1. 정의:

    • Duration은 초와 나노초 단위로 시간의 양을 표현한다. 주로 시간 간의 차이를 나타내는 데 사용된다.
  2. 사용 예시:

    import java.time.Duration;
    import java.time.Instant;
    
    public class Main {
        public static void main(String[] args) {
            Instant start = Instant.now();
            // 예시로 5초 후의 Instant
            Instant end = start.plusSeconds(5);
            
            Duration duration = Duration.between(start, end);
            System.out.println("지속 시간: " + duration.getSeconds() + "초");
        }
    }
  3. 주요 메서드:

    • between(start, end): 두 Instant 간의 Duration을 계산한다.
    • ofSeconds(seconds): 특정 초로 Duration을 생성한다.
    • toMillis(): 지속 시간을 밀리초로 변환한다.

요약

  • Period:

    • 연도, 월, 일 단위로 시간 간격을 표현.
    • 주로 날짜 간의 차이를 나타내는 데 사용.
  • Duration:

    • 초와 나노초 단위로 시간 간격을 표현.
    • 주로 시간 간의 차이를 나타내는 데 사용.

이 두 클래스는 날짜와 시간의 차이를 다루는 데 유용하며, 각각의 상황에 맞게 적절히 선택하여 사용할 수 있다.

0개의 댓글