본문 바로가기
Java

Java 중급 1 - 날짜와 시간(1)

by KongJiHoon 2025. 3. 16.

1. 자바 날짜와 시간 라이브러리

 

 

LocalDate, LocalTime, LocalDateTime

  • LocalDate
    • 날짜만 표현할 때 사용한다. 년, 월, 일을 다룬다. ex) 2013-11-21
  • LocalTime
    • 시간만을 표현할 때 사용. 시, 분, 초를 다룸. ex) 08.20.30.213
  • LocalDateTime
    • LocalDate 와 LocalTime을 합한 개념. ex) 2013-11-21T08:20:30.213
  • 타임존 적용 x

 

ZonedDateTime, OffsetDateTime

  • ZonedDateTime
    • 시간대를 고려한 날짜와 시간을 표현할 때 사용. 타임존 포함
    • ex) 2013-11-21T08:20:30.213+9:00[Asia/Seoul]
    • +9:00은 UTC로부터의 시간대 차이. 오프셋이라함.
    • 일광 절약 시간제가 적용
  • OffsetDateTime
    • 시간대를 고려한 날짜와 시간을 표현할 때 사용.
    • ` 2013-11-21T08:20:30.213+9:00
    • 일광 절약제 적용 x

Year, Month, YearMonth, MonthDay

  • 년, 월, 년월, 달일을 각각 다룰 때 사용한다. 자주 사용하지는 않는다. ` DayOfWeek `와 같이 월, 화, 수, 목, 금, 토, 일을 나타내는 클래스도 있다.

 

Instant

  • UTC(협정 세계시)를 기준으로 하는, 시간의 한 지점을 나타냄. Instant는 날짜와 시간을 나노초 정밀도로 표현
  • 쉽게 말해서 Instant 내부에는 초 데이터만 들어있다.(나노초 포함)

 

Period, Duration

  • Period
    • 두 날짜 사이의 간격을 년, 월, 일 단위로 나타낸다.
  • Duration
    • 두 시간 사이의 간격을 시, 분, 초 단위로 나타낸다.

 

2. 기본 날자와 시간 - LocalDateTime

LocalDate

package practice.time;

import java.time.LocalDate;

public class LocalDateMain {

    public static void main(String[] args) {

        LocalDate nowDate = LocalDate.now();

        LocalDate ofDate = LocalDate.of(2025, 3,15);

        System.out.println("오늘날짜 = " + nowDate);
        System.out.println("지정날짜 = " + ofDate);

        LocalDate plusDays = nowDate.plusDays(10);

        System.out.println("지정날짜 + 10D = " + plusDays);

    }


}

 

실행결과

오늘날짜 = 2025-03-16
지정날짜 = 2025-03-15
지정날짜 + 10D = 2025-03-26

 

메서드

  • 생성
    • now() : 현재 시간을 기준으로 생성
    • of(...) : 특정 날짜를 기준으로 생성한다. 년, 월, 일 입력 가능
  • 계산
    • plusDays() : 특정 일을 더한다. 다양한 plusXxx() 메서드 존재
  • 불변
    • 모든 날짜 클래스는 불변객체이다. 따라서 변경이 발생하는 경우 새로운 객체를 생성해서 반환하므로 반환값을 꼭 받아야한다.

 

LocalTime

package practice.time;

import java.time.LocalTime;

public class LocalTimeMain {


    public static void main(String[] args) {

        LocalTime nowTime = LocalTime.now();

        LocalTime ofTime = LocalTime.of(16, 19, 40);

        System.out.println("현재 시간 = " + nowTime);
        System.out.println("지정 시간 = " + ofTime);

        LocalTime plusTime = nowTime.plusSeconds(60);

        System.out.println("현재 시간 + 30s = " + plusTime);

    }

}

 

실행결과

현재 시간 = 16:20:49.642760800
지정 시간 = 16:19:40
현재 시간 + 30s = 16:21:49.642760800

 

  • 메서드
    • 생성
      • now() : 현재 시간을 기준으로 생성
      • of() : 특정 시간을 기준으로 생성한다. 시, 분, 초, 나노초를 입력할 수 있다.
    • 계산
      • plusSeconds() : 특정 초를 더한다. 다양한 plusXxx() 메서드 존재

 

LocalDateTime

 

package practice.time;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class LocalDateTimeMain {

    public static void main(String[] args) {

        LocalDateTime nowDateTime = LocalDateTime.now();

        LocalDateTime ofDateTime = LocalDateTime.of(2025, 3, 15, 20, 30);

        System.out.println("현재 날짜시간 = " + nowDateTime);
        System.out.println("지정 날짜시간 = " + ofDateTime);

        // 날짜와 시간 분리
        LocalDate localDate = nowDateTime.toLocalDate();
        LocalTime localTime = nowDateTime.toLocalTime();

        System.out.println("localDate = " + localDate);
        System.out.println("localTime = " + localTime);

        // 날짜와 시간 합체
        LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
        System.out.println("localDateTime = " + localDateTime);

        // 계산(불변객체)
        LocalDateTime nowDtPlus = nowDateTime.plusDays(1000);
        System.out.println("현재 날짜 + 1000D = " + nowDtPlus);

        LocalDateTime nowDtPlusYear = nowDateTime.plusYears(1);
        System.out.println("현재 날짜 + 1Year = " + nowDtPlusYear);

        // 비교

        System.out.println("현재 날짜시간이 지정 날짜보다 이전인가? " + nowDateTime.isBefore(ofDateTime));

        System.out.println("현재 날짜 시간이 지정날짜보다 이후인가? " + nowDateTime.isAfter(ofDateTime));

        System.out.println("현재 날짜시간과 지정날짜시간이 같은가? " + nowDateTime.isEqual(ofDateTime));


    }
}

 

실행결과

현재 날짜시간 = 2025-03-16T16:28:55.430932400
지정 날짜시간 = 2025-03-15T20:30
localDate = 2025-03-16
localTime = 16:28:55.430932400
localDateTime = 2025-03-16T16:28:55.430932400
현재 날짜 + 1000D = 2027-12-11T16:28:55.430932400
현재 날짜 + 1Year = 2026-03-16T16:28:55.430932400
현재 날짜시간이 지정 날짜보다 이전인가? false
현재 날짜 시간이 지정날짜보다 이후인가? true
현재 날짜시간과 지정날짜시간이 같은가? false

 

  • 메서드
    • 생성
      • now() : 현재 날짜와 시간 기준으로 생성
      • of() : 특정 날짜와 시간 기준으로 생성
    • 분리
      • 날짜(LocalDate)와 시간(LocalTime) 을 toXxx() 메서드로 분리할 수 있다.
    • 합체
      • LocalDateTime.of(localDate, localTime) 날짜와 시간을 이용해서 LocalDatetime을 만들 수 있다.
    • 계산
      • plusXxx() : 특정날짜와 시간을 더한다. 다양한 plusXxx()메서드 존재.
    • 비교
      • isBefore() : 다른 날짜시간과 비교한다. 현재 날짜와 시간이 이전이라면 true를 반환.
      • isAfter() : 다른 날짜시간과 비교. 현재 날짜와 시간이 이후라면 true를 반환
      • isEqual() : 다른 날짜시간과 비교. 현재 날짜와 시간이 동일하다면 true를 반환.
    • isEquals() vs equals()
      • isEquals는 단순히 비교대상이 시간적으로 같으면 true를 반환. 객체가 다르고, 타임존이 달라도 시간적으로 같으면 true를 반환한다.
        • ex) 서울의 9시와 UTC의 0시는 시간적으로 같다. 이 둘을 비교하면 true를 반환
      • equals() : 객체의 타입, 타임존 등등 내부 데이터의 모든 구성요소가 같아야 true를 반환
        • ex) 서울의 9시와 UTC 0시는 시간적으로 같다. 이 둘을 비교하면 타임존의 데이터가 다르기때문에 false를 반환.

 

3. 기간, 시간의 간격 - Duration, Period

 

Period

  • 두 날짜 사이의 간격을 년, 월, 일 단위로 나타낸다.
  • 예시
    • 이 프로젝트는 3개월 정도 걸릴거 같아
    • 기념일이 183일 남았다.
    • 프로젝트 시작일과 종료일 사이의 간격: 프로젝트 기간

 

Duration

  • 두 시간 사이의 간격을 시, 분, 초(나노초) 단위로 나타낸다.
  • 예시
    • 라면을 끓이는 시간 3분
    • 영화 상영 시간은 2시간 30분
    • 서울에서 부산까지 4시간

 

PeriodMain

package practice.time;

import java.time.LocalDate;
import java.time.Period;

public class PeriodMain {

    public static void main(String[] args) {

        // 생성
        Period period = Period.ofYears(10);
        System.out.println("period = " + period);


        // 계산에 사용
        LocalDate currentDate = LocalDate.of(2025, 3, 16);

        LocalDate plusDate = currentDate.plus(period);

        System.out.println("현재날짜: " + currentDate);
        System.out.println("더한날짜: " +plusDate);


        // 기간 차이
        LocalDate startDate = LocalDate.of(2025, 1, 1);

        LocalDate endDate = LocalDate.of(2025, 3, 16);

        Period between = Period.between(startDate, endDate);

        System.out.println("기간: " + between.getMonths() + "개월, " + between.getDays() + "일");




    }
}

 

실행결과

period = P10Y
현재날짜: 2025-03-16
더한날짜: 2035-03-16
기간: 2개월, 15일

 

  • 메서드
    • 생성 
      • of() : 특정 기간을 지정해서 Period를 생성
        • of(년, 월, 일)
        • ofDays()
        • ofMonths()
        • ofYears()
    • 계산에 사용
      • 2025년-03-16에 10년을 더하면 2035년 3월 16일이 된다. 특정날짜에 기간을 더할 수 있다.
    • 기간 차이
      • Period.between(startDate, endDate)와 같이 특정 날짜의 차이를 구하면 Period가 반환된다.

 

DurationMain

package practice.time;

import java.time.Duration;
import java.time.LocalTime;

public class DurationMain {

    public static void main(String[] args) {

        // 생성
        Duration duration = Duration.ofMinutes(30);
        System.out.println("duration = " + duration);

        LocalTime lt = LocalTime.of(1, 0);
        System.out.println("기준시간 = " + lt);

        // 계산에 사용
        LocalTime plusTime = lt.plus(duration);
        System.out.println("더한시간 = " + plusTime);

        // 시간 차이
        LocalTime startTime = LocalTime.of(9, 0);
        LocalTime endTime = LocalTime.of(10, 0);

        Duration between = Duration.between(startTime, endTime);

        System.out.println("차이: " + between.getSeconds());
        System.out.println("근무 시간: " + between.toHours() + "시간 " +
                between.toMinutesPart() + "분");

    }
}

 

실행결과

duration = PT30M
기준시간 = 01:00
더한시간 = 01:30
차이: 3600
근무 시간: 1시간 0분

 

  • 메서드
    • 생성 
      • of() : 특정 시간을 지정해서 Duration를 생성
        • of(년, 월, 일)
        • ofSeconds()
        • ofMinutes()
        • ofHours()
    • 계산에 사용
      • 1:00에 30분을 더하면 1:30이된다. 특정시간에 시간(시간의 간격)을 더할 수 있다.
    • 기간 차이
      • Duration.between(startTime, endTime)와 같이 특정 시간의 차이를 구하면 Duration가 반환된다.

 

날짜와 시간의 핵심 인터페이스

TemporalAccessor 인터페이스

  • 날짜와 시간을 읽기 위한 기본 인터페이스
  • 이 인터페이스는 특정 시점의 날짜와 시간 정보를 읽을 수 있는 최소한의 기능을 제공

 

Temporal 인터페이스

  • TemporalAccessor의 하위 인터페이스로, 날짜와 시간을 조작하기 위한 기능을 제공. 이를 통해 날짜와 시간을 변경하거나 조작할 수 있다.
  • 간단히 말하면, TemporalAccessor는 읽기 전용 접근을, Temporal은 읽기와 쓰기 모두를 지원

 

TemporalAmount 인터페이스

  • 시간의 간격을 나타내며, 날짜와 시간 객체에 적용하여 그객체를 조정할 수 있다.

 

 

출처: 김영한 자바 중급1

'Java' 카테고리의 다른 글

Java 중급 1 - 날짜와 시간(3)  (0) 2025.03.23
Java 중급 1 - 날짜와 시간(2)  (0) 2025.03.19
Java 중급 1 - 열거형 Enum  (0) 2025.02.24
Java 중급 1 - Wrapper Class  (0) 2025.02.24
Java 중급 1 - String  (0) 2025.02.14