Java 8에서 도입된 java.time 패키지에는 날짜와 시간을 다루기 위한 여러 클래스가 들어 있어요.
LocalDatejava.time.LocalDate 클래스는 ISO-8601 달력 체계에서 시간대 없이 날짜를 나타내요. 2007-12-03 같은 값이에요:
LocalDate date = LocalDate.of(2007, 12, 3);
날짜는 다른 날짜와 비교할 수 있어요:
LocalDate date1 = LocalDate.of(2007, 12, 3);
LocalDate date2 = LocalDate.of(2007, 12, 4);
date1.isBefore(date2);
// => true
date1.isAfter(date2);
// => false
LocalDate 인스턴스에는 날짜의 각 부분을 가져오는 게터가 있어요:
LocalDate date = LocalDate.of(2007, 12, 3);
date.getYear();
// => 2007
date.getMonthValue();
// => 12
date.getDayOfMonth();
// => 3
LocalDate 인스턴스에는 시간 단위를 더하는 메서드도 있어요.
이 메서드들은 새로운 LocalDate 인스턴스를 반환하고 기존 인스턴스는 바꾸지 않아요. LocalDate 클래스는 불변이기 때문이에요.
LocalDate date = LocalDate.of(2007, 12, 3);
date.plusDays(3);
// => 2007-12-06
date.plusMonths(1);
// => 2008-01-03
date.plusYears(1);
// => 2008-12-03
LocalDateTimejava.time.LocalDateTime 클래스는 ISO-8601 달력 체계에서 시간대 없이 날짜와 시간을 나타내요. 2007-12-03T10:15:30 같은 값이에요:
LocalDateTime datetime = LocalDateTime.of(2007, 12, 3, 10, 15, 30);
datetime.getYear();
// => 2007
datetime.getMonthValue();
// => 12
datetime.getDayOfMonth();
// => 3
datetime.getHours();
// => 10
datetime.getMinutes();
// => 15
datetime.getSeconds();
// => 30
LocalDate 클래스와 마찬가지로, LocalDateTime 인스턴스에도 다른 LocalDateTime과 비교하거나 시간 단위를 더하는 같은 메서드들이 있어요.
LocalDate 인스턴스를 LocalDateTime으로 변환할 수도 있어요:
LocalDate date = LocalDate.of(2007, 12, 3);
LocalDateTime datetime = date.atTime(10, 15, 30);
datetime.toString();
// => "2007-12-03T10:15:30"
LocalDate와 LocalDateTime은 모두 String으로 변환하거나 String에서 변환할 때 ISO-8601 표준 표기법을 사용해요.
LocalDateTime datetime = LocalDateTime.of(2007, 12, 3, 10, 15, 30);
LocalDateTime parsed = LocalDateTime.parse("2007-12-03T10:15:30");
datetime.isEqual(parsed);
// => true
이런 식으로 다른 형식을 사용해 String에서 LocalDate나 LocalDateTime을 파싱하는 것은 불가능해요.
대신 사용자 지정 형식으로 날짜를 서식 지정하려면 java.time.format.DateTimeFormatter를 사용해야 해요:
DateTimeFormatter parser = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date = LocalDate.parse("03/12/2007", formatter);
DateTimeFormatter printer = DateTimeFormatter.ofPattern("MMMM d, yyyy");
printer.format(date);
// => "December 3, 2007"
사용자 지정 형식을 만들 때 로케일을 지정해서 지역마다 다른 형식으로 서식을 지정하고 파싱할 수도 있어요:
DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.FRENCH).format(date);
// => décembre 3, 2007
DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.of("pt")).format(date);
// => dezembro 3, 2007