[Java8] 새로운 날짜와 시간 API

새로운 날짜와 시간 API

LocalDate, LocalTime, Instant, Duration, Period

LocalDate와 LocalTime 사용

LocalDate date = LocalDate.of(2014, 3, 18);
int year = date.getYear(); // 2014
Month month = date.getMonth(); // MARCH
int day = date.getDayOfMonth(); // 18
DayOfWeek dow = date.getDayOfWeek(); // TUESDAY
int len = date.lengthOfMonth(); // 31 (days in March)
boolean leap = date.isLeapYear(); // false (not a leap year)
System.out.println(date);

int y = date.get(ChronoField.YEAR);
int m = date.get(ChronoField.MONTH_OF_YEAR);
int d = date.get(ChronoField.DAY_OF_MONTH);
LocalTime time = LocalTime.of(13, 45, 20); // 13:45:20
int hour = time.getHour(); // 13
int minute = time.getMinute(); // 45
int second = time.getSecond(); // 20
System.out.println(time);
LocalDate date = LocalDate.parse("2014-03-18");
LocalTime time = LocalTime.parse("13:45:20");

날짜와 시간 조합

LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20); // 2014-03-18T13:45
LocalDateTime dt2 = LocalDateTime.of(date, time);
LocalDateTime dt3 = date.atTime(13, 45, 20);
LocalDateTime dt4 = date.atTime(time);
LocalDateTime dt5 = time.atDate(date);
System.out.println(dt1);

Instant: 기계의 날짜와 시간

Instant instant = Instant.ofEpochSecond(44 * 365 * 86400);
Instant now = Instant.now();

Duration과 Period 정의

Duration d1 = Duration.between(LocalTime.of(13, 45, 10), time);
Duration d2 = Duration.between(instant, now);
System.out.println(d1.getSeconds());
System.out.println(d2.getSeconds());
// 단 LocalDateTime은 사람이 사용하도록, Instant는 기계가 사용하도록 만들어진 클래스로 같이 사용할 수는 없다.
Period tenDays = Period.between(LocalDate.of(2014, 3, 8), LocalDate.of(2014, 3, 18));

Duration과 Period 클래스가 공통으로 제공하는 메서드

날짜 조정, 파싱, 포매팅

LocalDate date = LocalDate.of(2014, 3, 18);
date = date.withYear(2017);
date = date.withDayOfMonth(25);
date = date.with(ChronoField.MONTH_OF_YEAR);
LocalDate date1 = LocalDate.of(2014, 3, 18);
// 2017-05-03
LocalDate date2 = date1.plusWeeks(1);
// 2017-05-10
LocalDate date3 = date2.minusYears(3);
// 2014-05-10
LocalDate date4 = date3.plus(6, ChronoUnit.MONTHS);
// 2014-11-10

특정 시점을 표현하는 날짜 시간 클래스의 공통 메서드

TemporalAdjusters 사용하기

import static java.time.temporal.TemporalAdjusters.*;
LocalDate date1 = LocalDate.of(2014, 3, 18);
// 2014-03-18
LocalDate date2 = date1.with(nextOrSame(DayOfWeek.SUNDAY));
// 2014-03-23
LocalDate date3 = date2.with(lastDayOfMonth());
// 2014-03-31

TemporalAdjusters 클래스의 팩토리 메서드

date = date.with(temporal -> {
    DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));
    int dayToAdd = 1;
    if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;
    if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;
    return temporal.plus(dayToAdd, ChronoUnit.DAYS);
});

날짜와 시간 객체 출력과 파싱

LocalDate date = LocalDate.of(2014, 3, 18);
String sl = date.format(DateTimeFormatter.BASIC_ISO_DATE);
// 20140318
String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
// 2014-03-18
LocalDate date1 = LocalDate.parse("20140318", DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date2 = LocalDate.parse("2014-03-18", DateTimeFormatter.ISO_LOCAL_DATE);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date1 = LocalDate.of(2014, 3, 18);
String formattedDate = date1.format(formatter);
LocalDate date2 = LocalDate.parse(formattedDate, formatter);

다양한 시간대와 캘린더 활용 방법

// 새롭게 등장한 Zoneld
Zoneld romeZone = Zoneld.of("EuropejRome");
// 기존의 TimeZone -> Zoneld로 변경 가능
Zoneld zoneld = TimeZone.getDefault().toZoneld();

LocalDate date = LocalDate.of(2014, Month.MARCH, 18);
ZonedDateTime zdt1 = date.atStartOfDay(romeZone);

LocalDateTime dateTime = LocalDateTime .of(2014, Month.MARCH , 18, 13, 45);
ZonedDateTime zdt2 = dateTime.atZone(romeZone);

Instant instant = Instant.now();
ZonedDateTime zdt3 = instant .atZone(romeZone);

ZonedDateTime

요약