Java 8 Date and Time API

JavaBeginner
지금 연습하기

소개

Java 8 은 JodaTime 라이브러리에서 영감을 얻은 새로운 Date and Time API 를 도입했습니다. 이는 기존 Date API 의 단점을 극복합니다. 이 Lab 에서는 새로운 Date and Time API 를 사용하여 날짜와 시간을 조작하는 방법을 배우겠습니다.

LocalDate 인스턴스 생성

LocalDate 클래스는 표준 ISO 형식 (yyyy-mm-dd) 으로 날짜를 나타내는 데 사용됩니다. 시간 정보를 포함하지 않으며, 타임존 (timezone) 을 지원하지 않습니다.

now() 메서드를 사용하여 LocalDate 클래스의 인스턴스를 생성할 수 있습니다. 이는 시스템 시계에 따라 현재 날짜를 캡처합니다.

import java.time.LocalDate;

public class DateTimeExample {
    public static void {
        LocalDate currentDate = LocalDate.now();
        System.out.println("Current Date: " + currentDate);
    }
}

다음 명령을 사용하여 코드를 저장하고 실행합니다.

javac DateTimeExample.java && java DateTimeExample

다음과 같은 출력을 볼 수 있습니다.

Current Date: 2021-08-13

날짜 문자열 파싱

날짜의 문자열 표현을 사용하여 LocalDate 클래스의 인스턴스를 생성할 수 있습니다.

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        String str = "2021-08-13";
        LocalDate date = LocalDate.parse(str);
        System.out.println("Date: " + date);
    }
}

다음 명령을 사용하여 코드를 저장하고 실행합니다.

javac DateTimeExample.java && java DateTimeExample

다음과 같은 출력을 볼 수 있습니다.

Date: 2021-08-13

더하기 및 빼기 메서드

plusDays() 또는 minusDays() 메서드를 사용하여 날짜에 일, 월 또는 년을 더하거나 뺄 수 있습니다. 또한 월과 년을 변경하는 유사한 메서드도 있습니다.

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currDate = LocalDate.now();
        LocalDate yesterday = currDate.minusDays(1);
        LocalDate tomorrow = currDate.plusDays(1);

        System.out.println("Current Date: " + currDate);
        System.out.println("Tomorrow's Date: " + tomorrow);
        System.out.println("Yesterday's Date: " + yesterday);
    }
}

다음 명령을 사용하여 코드를 저장하고 실행합니다.

javac DateTimeExample.java && java DateTimeExample

다음과 같은 출력을 볼 수 있습니다.

Current Date: 2021-08-13
Tomorrow's Date: 2021-08-14
Yesterday's Date: 2021-08-12

Getter 메서드

LocalDate 클래스는 LocalDate 에서 요일 또는 월의 일과 같은 다양한 정보를 가져오기 위한 여러 getter 메서드를 포함합니다.

import java.time.DayOfWeek;
import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currDate = LocalDate.now();
        DayOfWeek dayOfWeek = currDate.getDayOfWeek();
        int dayOfMonth = currDate.getDayOfMonth();
        int dayOfYear = currDate.getDayOfYear();

        System.out.println("Date: " + currDate);
        System.out.println("Day of Week: " + dayOfWeek);
        System.out.println("Day of Month: " + dayOfMonth);
        System.out.println("Day of Year: " + dayOfYear);
    }
}

다음 명령을 사용하여 코드를 저장하고 실행합니다.

javac DateTimeExample.java && java DateTimeExample

다음과 같은 출력을 볼 수 있습니다.

Date: 2021-08-13
Day of Week: FRIDAY
Day of Month: 13
Day of Year: 225

날짜 비교

isBefore() 및 isAfter() 메서드를 사용하여 날짜를 비교하여 어떤 날짜가 더 큰지 확인할 수 있습니다.

import java.time.LocalDate;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDate currDate = LocalDate.now();
        LocalDate tomorrow = currDate.plusDays(1);
        LocalDate yesterday = currDate.minusDays(1);

        System.out.println("Current date is after yesterday's date: " + currDate.isAfter(yesterday));
        System.out.println("Current date is before tomorrow's date: " + currDate.isBefore(tomorrow));
    }
}

다음 명령을 사용하여 코드를 저장하고 실행합니다.

javac DateTimeExample.java && java DateTimeExample

다음과 같은 출력을 볼 수 있습니다.

Current date is after yesterday's date: true
Current date is before tomorrow's date: true

LocalTime 인스턴스 생성

LocalTime 인스턴스를 생성하기 위해 now(), of(), 또는 parse() 메서드를 사용할 수 있습니다. now() 메서드는 시스템의 시계를 사용하여 현재 시간을 가져옵니다. of() 및 parse() 메서드는 전달된 매개변수에 따라 LocalTime 을 생성할 수 있습니다.

import java.time.LocalTime;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalTime currentTime = LocalTime.now();
        LocalTime t1 = LocalTime.of(5, 32, 44);
        LocalTime t2 = LocalTime.parse("05:32:44");

        System.out.println(currentTime);
        System.out.println(t1);
        System.out.println(t2);
    }
}

다음 명령을 사용하여 코드를 저장하고 실행합니다.

javac DateTimeExample.java && java DateTimeExample

다음과 같은 출력을 볼 수 있습니다.

17:43:08.749240
05:32:44
05:32:44

더하기 및 빼기 메서드

plus() 및 minus() 메서드를 사용하여 LocalTime 인스턴스를 조작할 수 있습니다.

import java.time.LocalTime;
import java.time.temporal.ChronoUnit;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalTime t1 = LocalTime.of(5, 32, 44);
        LocalTime t2 = t1.plus(2, ChronoUnit.HOURS);
        LocalTime t3 = t1.minusMinutes(10);

        System.out.println(t1);
        System.out.println(t2);
        System.out.println(t3);
    }
}

다음 명령을 사용하여 코드를 저장하고 실행합니다.

javac DateTimeExample.java && java DateTimeExample

다음과 같은 출력을 볼 수 있습니다.

05:32:44
07:32:44
05:22:44

LocalDateTime 인스턴스 생성

LocalDateTime 클래스는 LocalDate 및 LocalTime 클래스의 조합입니다. LocalDateTime 인스턴스는 날짜 구성 요소와 시간 구성 요소를 포함합니다.

import java.time.LocalDateTime;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDateTime currDateTime = LocalDateTime.now();
        LocalDateTime dt1 = LocalDateTime.of(2020, 8, 13, 5, 32);
        LocalDateTime dt2 = LocalDateTime.parse("2020-08-13T05:32");

        System.out.println(currDateTime);
        System.out.println(dt1);
        System.out.println(dt2);
    }
}

다음 명령을 사용하여 코드를 저장하고 실행합니다.

javac DateTimeExample.java && java DateTimeExample

다음과 같은 출력을 볼 수 있습니다.

2021-08-13T17:46:48.837697
2020-08-13T05:32
2020-08-13T05:32

타임존 (Timezone) 다루기

위에 논의된 클래스들은 타임존을 지원하지 않습니다. ZonedDateTime 클래스는 이 기능을 제공합니다. ZoneId 클래스를 사용하여 서로 다른 타임존을 식별할 수 있습니다.

import java.time.ZonedDateTime;
import java.time.ZoneId;

public class DateTimeExample {
    public static void main(String[] args) {
        ZonedDateTime zdt = ZonedDateTime.now();
        ZoneId zoneTokyo = ZoneId.of("Asia/Tokyo");
        ZonedDateTime zdtT = ZonedDateTime.now(zoneTokyo);
        ZoneId zoneLondon = ZoneId.of("Europe/London");
        ZonedDateTime zdtL = ZonedDateTime.now(zoneLondon);

        System.out.println(zdt);
        System.out.println(zdtT);
        System.out.println(zdtL);
    }
}

다음 명령을 사용하여 코드를 저장하고 실행합니다.

javac DateTimeExample.java && java DateTimeExample

다음과 같은 출력을 볼 수 있습니다.

2021-08-13T18:09:25.352237+05:30[Asia/Calcutta]
2021-08-13T21:39:25.356244+09:00[Asia/Tokyo]
2021-08-13T13:09:25.357316+01:00[Europe/London]

날짜 형식 지정 (Formatting Dates)

Java 8 은 특정 패턴을 사용하여 날짜를 문자열로 형식화하는 format() 함수를 제공합니다.

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateTimeExample {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();
        String dateStr1 = dateTime.format(DateTimeFormatter.ISO_WEEK_DATE);
        String dateStr2 = dateTime.format(DateTimeFormatter.BASIC_ISO_DATE);
        String dateStr3 = dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
        String dateStr4 = dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy hh:mm:ss"));

        System.out.println(dateStr1);
        System.out.println(dateStr2);
        System.out.println(dateStr3);
        System.out.println(dateStr4);
    }
}

다음 명령을 사용하여 코드를 저장하고 실행합니다.

javac DateTimeExample.java && java DateTimeExample

다음과 같은 출력을 볼 수 있습니다.

2021-W32-5
20210813
2021-08-13T18:16:57.675704
13/08/2021 06:16:57

요약

이 랩에서는 Java 8 Date and Time API 를 사용하여 날짜와 시간을 조작하는 방법을 배웠습니다. LocalDate, LocalTime 및 LocalDateTime 클래스의 인스턴스를 생성하고, plus() 및 minus() 메서드를 사용하여 조작하고, getter 메서드를 사용하여 정보를 얻는 방법을 배웠습니다. 또한 ZonedDateTime 클래스를 사용하여 타임존으로 작업하고 DateTimeFormatter 클래스를 사용하여 날짜를 형식화하는 방법을 배웠습니다.