본문 바로가기
Java

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

by KongJiHoon 2025. 3. 23.

날짜와 시간 조회 및 조작 1

package practice.time;

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

public class GetTimeMain {

    public static void main(String[] args) {

        LocalDateTime dt = LocalDateTime.of(2025, 3, 23, 12, 35, 59);
        System.out.println("YEAR = " + dt.get(ChronoField.YEAR));

        System.out.println("MONTH_OF_YEAR = " + dt.get(ChronoField.MONTH_OF_YEAR));

        System.out.println("DAY_OF_WEEK = " + dt.get(ChronoField.DAY_OF_WEEK));

        System.out.println("HOUR_OF_DAY = " + dt.get(ChronoField.HOUR_OF_DAY));

        System.out.println("MINUTE_OF_HOUR = " + dt.get(ChronoField.MINUTE_OF_HOUR));

        System.out.println("SECOND_OF_MINUTE = " + dt.get(ChronoField.SECOND_OF_MINUTE));

        // 편의 메서드
        System.out.println("=== 편의 메서드 사용 ===");
        System.out.println("YEAR = " + dt.getYear());

        System.out.println("MONTH_OF_YEAR = " + dt.getMonthValue());

        System.out.println("DAY_OF_WEEK = " + dt.getDayOfWeek());

        System.out.println("HOUR_OF_DAY = " + dt.getHour());

        System.out.println("MINUTE_OF_HOUR = " + dt.getMinute());

        System.out.println("SECOND_OF_MINUTE = " + dt.getSecond());


    }

}

 

실행결과

YEAR = 2025
MONTH_OF_YEAR = 3
DAY_OF_MONTH = 23
HOUR_OF_DAY = 12
MINUTE_OF_HOUR = 35
SECOND_OF_MINUTE = 59
=== 편의 메서드 사용 ===
YEAR = 2025
MONTH_OF_YEAR = 3
DAY_OF_WEEK = 23
HOUR_OF_DAY = 12
MINUTE_OF_HOUR = 35
SECOND_OF_MINUTE = 59

 

TemporalAccessor.get(TemporalField field)

  • LocalDateTime을 포함한 특정 시점의 시간을 제공하는 클래스는 모두 TemporalAccessor인터페이스를 구현
  • get(TemporalField field)을 호출할 때 어떤 날짜와 시간 필드를 조회할 지 TemporalField의 구현체인 ChronoField를 인수로 전달하면된다.

 

편의 메서드사용

  • dt.get(ChronoField.DAY_OF_MONTH) -> dt.getDayOfMonth
  • 자주 사용하는 조회 필드는 간단한 편의 메서드를 제공

 

 

날짜와 시간 조작

 

package practice.time;

import java.time.LocalDateTime;
import java.time.Period;
import java.time.temporal.ChronoUnit;

public class ChangeTimePlus {


    public static void main(String[] args) {

        LocalDateTime dt = LocalDateTime.of(2025, 3, 23, 13, 8, 59);

        System.out.println("dt = " + dt);

        LocalDateTime plusDt1 = dt.plus(10, ChronoUnit.YEARS);
        System.out.println("plusDt1 = " + plusDt1);

        // 편의 메서드 사용
        LocalDateTime plusDt2 = dt.plusYears(10);
        System.out.println("plusDt2 = " + plusDt2);

        Period period = Period.ofYears(10);

        LocalDateTime plusDt3 = dt.plus(period);
        System.out.println("plusDt3 = " + plusDt3);


    }
}

 

실행 결과

dt = 2025-03-23T13:08:59
plusDt1 = 2035-03-23T13:08:59
plusDt2 = 2035-03-23T13:08:59
plusDt3 = 2035-03-23T13:08:59

 

Temporal plus

  • LocalDateTime을 포함한 특정 시점의 시간을 제공하는 클래스는 모두 Temporal 인터페이스를 구현
  • plus(long amountToAdd, ChronoUnit unit)를 호출할 때 더할 숫자와 시간의 단위를 전달하면 된다.
  • 불변이므로 반환값을 받아야함.
  • 편의 메서드 제공
    • dt.plus(10, ChronoUnit.YEARS) -> dt.plusYears(10)

 

날짜와 시간 조작2

package practice.time;

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class ChangeTimeWithMain {
    public static void main(String[] args) {

        LocalDateTime dt = LocalDateTime.of(2025, 3, 23, 13, 14, 59);
        System.out.println("dt = " + dt);

        LocalDateTime changeDt1 = dt.with(ChronoField.YEAR, 2020);
        System.out.println("changeDt1 = " + changeDt1);

        LocalDateTime changeDt2 = dt.withYear(2020);
        System.out.println("changeDt2 = " + changeDt2);

        // TemporalAdjuster 사용
        LocalDateTime with1 = dt.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));

        System.out.println("기준 날짜" + dt);
        System.out.println("다음 금요일: " + with1);

        LocalDateTime with2 = dt.with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));
        System.out.println("같은 달의 마지막 일요일 = " + with2);



    }
}

 

실행결과

dt = 2025-03-23T13:14:59
changeDt1 = 2020-03-23T13:14:59
changeDt2 = 2020-03-23T13:14:59
기준 날짜2025-03-23T13:14:59
다음 금요일: 2025-03-28T13:14:59
같은 달의 마지막 일요일 = 2025-03-30T13:14:59

 

Temporal.with

  • Temporal.with()를 사용하면 날짜와 시간의 특정필드의 값만 변경할 수 있다.
  • 편의 메서드 제공
    • dt.with(ChronoUnit.YEAR, 2020) -> dt.withYear(2020)

 

TemporalAdjusters

  • 다음 금요일, 이번달의 마지막 일요일 등과 같이 복잡한 날짜를 계산하고 싶다면 TemporalAdjuster사용.

 

DayOfWeek

  • 월, 화, 수, 목, 금, 토, 일을 나타내는 열거형

 

 

날짜와 시간 문자열 파싱과 포멧팅

package practice.time;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class FormattingMain1 {
    public static void main(String[] args) {

        // 포멧팅: 날짜를 문자열로

        LocalDate date = LocalDate.of(2025, 3, 23);

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일");

        String formatedDate = date.format(formatter);
        System.out.println("날짜와 시간 포멧팅: " + formatedDate);

        // 파싱: 문자를 날짜로

        String input = "2030년 01월 01일";
        LocalDate parsedDate = LocalDate.parse(input, formatter);
        System.out.println("문자열 파싱 날짜와 시간: " + parsedDate);


    }
}

 

실행결과

날짜와 시간 포멧팅: 2025년 03월 23일
문자열 파싱 날짜와 시간: 2030-01-01

 

 

출처: 김영한 자바 중급 1