diff --git a/Ch12.md b/Ch12.md new file mode 100644 index 0000000..692991f --- /dev/null +++ b/Ch12.md @@ -0,0 +1,72 @@ +## LocalDate, LocalTime, Instant, Duration, Period + +### LocalDate +- 시간을 제외한 날짜 정보만 가지고 있는 클래스이다. +- 정적 팩토리 메서드 of로 LocalDate 인스턴스를 만들 수 있다. +### LocalTime +- 날짜를 제외한 시간 정보만 가지고 있는 클래스이다. +- 정적 팩토리 메서드 of로 LocalTime 인스턴스를 만들 수 있다. +### LocalDateTime +- LocalDate와 LocalTime을 전부 가지고 있는 클래스이다. +- 정적 팩토리 메서드 of로 LocalDateTime 인스턴스를 만들 수 있다. +- 정적 팩토리 메서드 of를 만들 때 LocalDate와 LocalTime을 인수로 받을 수 있다. +### Instant +- 유닉스 에포크 시간(1970년 1월 1일 0시 0분 0초 UTC)을 기준으로 특정 지점까지의 시간을 **초**로 표현한다. +- LocalDateTime은 TimeZone을 포함하고 있지 않기 때문에 TimeZone을 가지고 있는 ZoneDateTime으로 표현하기 위해서는 Instant로 변환해야 하는 작업이 필요하다. +### Duration +- Duration은 두 **시간 객체** 사이의 간격을 알 수 있는 클래스이다. +### Period +- Period는 두 **날짜 객체** 사이의 간격을 알 수 있는 클래스이다. + +### TemporalAdjusters +- TemporalAdjusters가 제공하는 정적 팩토리 메서드를 활용하면 날짜 조정기능을 쉽게 사용할 수 있다. + +|메서드|설명| +|---|---| +|dayOfWeekInMonth|요일에 해당하는 날짜를 반환함(음수를 사용하면 월의 끝에서 거꾸로 계산| +|firstDayOfMonth|현재 달의 첫 번째 날짜를 반환함| +|firstDayOfNextMonth|다음 달의 첫 번째 날짜를 반환함| +|firstDayOfNextYear|내년의 첫 번째 날짜를 반환함| +|firstDdayOfYear|올해의 첫 번째 날짜를 반환함| +|firstInMonth|현재 달의 첫 번째 날짜를 반환함| +|lastDayOfMonth|이번 달의 마지막 날짜를 반환함| +|lastDayOfNextMonth|다음 달의 마지막 날짜를 반환함| +|lastDayOfNextYear|내년의 마지막 날짜를 반환함| +|lastDayOfYear|올해의 마지막 날짜를 반환함| +|lastInMonth|이번달의 마지막 날짜를 반환함| +|next|현재 달에서 현재 날짜 이후로 지정한 요일이 처음으로 나타나는 날짜를 반환함| +|previous|현재 달에서 현재 날짜 이전에 지정한 요일이 처음으로 나타나는 날짜를 반환함| +|nextOrSame|현재 날짜 이후 지정한 요일이 처음으로 나타나는 날짜를 반환함| +|previousOrSame|현재 날짜 이전에 지정한 요일이 처음으로 나타나는 날짜를 반환함| + +### 평일을 NextWorkingDay를 구하는 로직 +```java +public class NextWorkingDay implements TemporalAdjuster { + @Override + public Temporal adjustInto(Temporal temporal) { + DayOfWeek dow = + DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK)); + int dayToAdd = 1; // 평일의 경우 1일 추가 + if (dow == DayOfWeek.FRIDAY) dayToAdd = 3; // 금요일의 경우 3일을 추가해야 월요일이 된다. + else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2; // 토요일의 경우 2일을 더해야 월요일이 된다. + retun temporal.plus(dayToAdd, ChronoUnit.DAYS); + } +} +``` + +-> 현재 요일이 금요일일 경우 3일을 이동, 토요일일 경우 2일을 이동 해야 평일이 된다. + +람다표현식을 통해 다음과 같이 표현할 수 있다. +```java +date = date.with(temporal -> { + DayOfWeek dow = DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK)); + int dayToAdd = 1; + if(dow == DayOfWeek.FRIDAY) dayToAdd = 3; + else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2; + return temporal.plus(dayToAdd, ChronoUNit.DAYS); +}); +``` + +### ZoneDateTime +- TimeZone을 활용할 수 있는 날짜와 시간을 가지고 있는 클래스이다. +- ZoneId의 정적 팩토리 메서드인 of를 가지고 특정 Zone의 시간 대를 알 수 있다.