Java9 DateTime

날짜/시간

java.time

java8 에서 도입한 java.time API는 이전의 API들의 결함을 해결하고 날짜/시간을 다룰 경우 권장하고 있다.

지역 날짜 (LocalDate) / 지역 시간 (LocalTime)

LocalDAte는 연월일이 포함된 날짜다. 정적메서드 now또는 of를 사용한다.

LocalDate currentDate = LocalDate.now(); //오늘 날짜
LocalDate baseDate = LocalDate.of(2021,5,5);
LocalTime baseTime = LocalTime.now(); //현재 시간
LocalTime baseTime = LocalTime.of(22,30);

Chaining으로 메소드를 연결하여 객체를 다룰 수 있다.

//일부 예시
LocalDate baseDate = LocalDate.of(2021,5,5);
System.out.println(baseDate.plusDays(99).plusMonths(2).minusDays(2)); //2021-10-10

날짜 조정기

종종 ‘매월 첫 번째 일요일’ 같은 날짜를 계산할 때 사용할 수 있는 메서드가 있다.

TemproalAdjuster인터페이스를 상속받아 클래스 생성후 사용 할 수 있다.

우선 기본적으로 사용은 아래와 같이 할 수 있다.

LocalDate baseDate = LocalDate.of(2021,5,5);
System.out.println(baseDate.with(TemporalAdjusters.lastDayOfMonth())); // 2021-05-31
public class TheDayMartOff implements TemporalAdjuster {

    @Override
    public Temporal adjustInto(Temporal temporal) {
        //1. 계산을 위한 기준날짜
        LocalDate theDay = LocalDate.from(temporal);
        //2. 둘째 넷째 일요일을 구한다.
        LocalDate secondSunday = theDay.with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.SUNDAY));
        LocalDate fourthSunday = theDay.with(TemporalAdjusters.dayOfWeekInMonth(4, DayOfWeek.SUNDAY));

        //3. 기준 날짜가 둘째 일요일 이전이면 둘째 일요일, 넷째 일요일 이전이면 넷째 일요일
        //   둘 다 아니면 다음달 둘째 일요일을 반환한다.
        if (theDay.isBefore(secondSunday)){
            return secondSunday;
        } else if (theDay.isBefore(fourthSunday)){
            return fourthSunday;
        } else {
            return theDay.plusMonths(1).with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.SUNDAY));
        }
    }
}

위에서 선언한 클래스를 사용하면 아래와 같다.

LocalDate baseDate = LocalDate.of(2021,5,5);
System.out.println(baseDate.with(new TheDayMartOff())); //위에서 선언한 TheDayMartOff() 클래스 생성
// 결과 : 2021-05-09

Format

총 세가지 형식 지정 방식 있으나, 커스텀 지정방식만 살펴보면 아래와 같다.

LocalDate baseDate = LocalDate.of(2021,5,5);
String formattedDate = DateTimeFormatter.ofPattern("G yyyy.MM.dd").format(baseDate);
System.out.println(formattedDate); // 서기 2021.05.05