Android는 일부 Java 8 언어 기능을 지원하지 않습니다.
이 글은 EditPlus로 실행하였습니다.


package java.time

Date와 Calendar가 가지고 있던 단점들을 개선한 패키지.
4개의 하위 패키지를 가지고 있다.
날짜나 시간을 변경하는 메서드들은 항상 변경된 새로운 객체를 반환한다. = 불변Immutable





LocalDate와 LocalTime
java.time 패키지의 가장 기본이 되는 클래스들.
나머지 클래스들은 이들의 확장.



static LocalDate/LocalTime now()
현재의 날짜와 시간을 LocalDate와 LocalTime으로 각각 반환한다.
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();


static LocalDate/LocalTime of()
지정된 날짜와 시간으로 LocalDate와 LocalTime 객체를 생성한다.
static LocalDate of(int year, int month, int dayOfMonth)
static LocalDate of(int year, Month month, int dayOfMonth)

static LocalTime of(int hour, int minute, int second)
static LocalTime of(int hour, int minute, int second, int nanoOfSecond)
static LocalTime of(int hour, int minute)
LocalDate date = LocalDate.of(2017, 06, 02);    // 2017-06-02
LocalTime time = LocalTime.of(17, 41, 30);      // 17:41:30

일, 초 단위로 지정할 수 있다.
LocalDate date = LocalDate.ofYearDay(2017, 365);                //2017-12-31  
LocalTime time = LocalTime.ofSecondOfDay(17*3600+41*60+30);     //17:41:30


parse()
문자열을 날짜와 시간으로 변환
LocalDate date = LocalDate.parse("2017-06-02");       // 2017-06-02
LocalTime time = LocalTime.parse("17:41:30");         // 17:41:30




특정 필드의 값 가져오기 getXXX()
Calendar와 달리 월month의 범위가 1~12이고, 요일은 월요일 1 ~ 일요일 7이다.


•  LocalDate
메서드 설명 2017-06-07
int getYear() 년도 2017
int getMonthValue() 6
Month getMonth() JUNE. getMonth().getValue()=6
int getDayOfMonth() 7
int getDayOfYear() 같은 해의 1월 1일부터 몇 번째 일 518
DayOfWeek getDayOfWeek() 요일 WEDNESDAY. getDayOfWeek().getValue()=3
int lengthOfMonth() 같은 달의 총 일수 30
int lengthOfYear() 같은 해의 총 일수. 윤년이면 366 365
boolean isLeapYear() 윤년여부 확인 false


•  LocalTime
메서드 설명 2017-06-07 10:51:37
int getHour() 10
int getMinute() 51
int getSecond() 37
int getNano() 나노초 404000000




특정 필드의 값 가져오기 get()

int타입의 범위를 넘어서는 필드는 getLong()을 사용해야 한다.


•  LocalDate - int get(TemporalField field)
TemporalField(ChronoField) 설명 2017-06-07
ERA 시대 1
YEAR_OF_ERA 2017
YEAR 2017
MONTH_OF_YEAR 6
DAY_OF_WEEK 요일(1:월,2:화…7:일) 3
DAY_OF_MONTH 7
DAY_OF_YEAR 그 해의 몇 번째 날 158
ALIGNED_WEEK_OF_MONTH 그 달의 n번째 주(1~7일 1주, 8~14일 2주,…) 1
ALIGNED_WEEK_OF_YEAR 그 해의 n번째 주(1월 1~7일 1주, 8~14일 2주, …) 23
ALIGNED_DAY_OF_WEEK_IN_MONTH 요일 (그 달의 1일을 월요일로 간주하여 계산) 7
ALIGNED_DAY_OF_WEEK_IN_YEAR 요일 (그 해의 1월 1일을 월요일로 간주하여 계산) 4


•  LocalDate - long getLong(TemporalField field)
TemporalField(ChronoField) 설명 2017-06-07
EPOCH_DAY EPOCH(1970.1.)부터 몇 번째 날 17324


•  LocalTime - int get(TemporalField field)
TemporalField(ChronoField) 설명 10:51:37
AMPM_OF_DAY 오전/오후 0
HOUR_OF_DAY 시간(0~23) 10
CLOCK_HOUR_OF_DAY 시간(1~24) 10
HOUR_OF_AMPM 시간(0~11) 10
CLOCK_HOUR_OF_AMPM 시간(1~12) 10
MINUTE_OF_HOUR 51
SECOND_OF_MINUTE 37
MILLI_OF_SECOND 천분의 일초 404
MINUTE_OF_DAY 그 날의 몇 번째 분(시간을 분으로 환산) 651
SECOND_OF_DAY 그 날의 몇 번째 초(시간을 초로 환산) 39097
MILLI_OF_DAY 그 날의 몇 번째 밀리초(=10-3초 39097404
INSTANT_SECONDS 년월일을 초단위로 환산(1970-01-01 00:00:00 UTC를 0초로 계산). Instant에만 사용 가능  
OFFSET_SECONDS UTC와 시차. ZoneOffset에만 사용 가능  
PROLEPTIC_MONTH 년월을 월 단위로 환산(2017년06월=2017*12+06)  


•  LocalTime - long getLong(TemporalField field)
TemporalField(ChronoField) 설명 10:51:37
MICRO_OF_SECOND 백만 분의 일초 404000
NANO_OF_SECOND 10억분의 일초 404000000
MICRO_OF_DAY 그 날의 몇 번째 마이크로초(=10-6초) 39094404000
NANO_OF_DAY 그 날의 몇 번째 나노초(=10-9초) 39097404000000


•  range()
    상수 끝에 붙이면 특정 필드가 가질 수 있는 값의 범위를 알 수 있다.
System.out.println(ChronoField.HOUR_OF_DAY.range());       // 0 - 23




필드의 값 변경하기

•  with()
    원하는 필드를 직접 지정하여 변경할 수 있다.
LocalDate with(TemporalField field, long newValue)
LocalTime with(TemporalField field, long newValue)

    with로 시작하는 메서드를 사용하여 날짜와 시간에서 특정 필드 값을 변경할 수 있다.
LocalDate withDayOfMonth(int dayOfMonth)
LocalDate withDayOfYear(int dayOfYear)
LocalDate withMonth(int month)
LocalDate withYear(int year)

LocalTime withHour(int hour)
LocalTime withMinute(int minute)
LocalTime withNano(int nanoOfSecond)
LocalTime withSecond(int second)

    필드를 변경하는 메서드들은 항상 새로운 객체를 생성한다.


•  plus(), minus()
    특정 필드에 값을 더하거나 뺀다.
LocalTime plus(TemporalAmount amountToAdd)
LocalTime plus(long amountToAdd, TemporalUnit unit)

LocalDate plus(TemporalAmount amountToAdd)
LocalDate plus(long amountToAdd, TemporalUnit unit)

LocalDate plusDays(long daysToAdd)
LocalDate plusMonths(long monthsToAdd)
LocalDate plusWeeks(long weeksToAdd)
LocalDate plusYears(long yearsToAdd)

LocalTime plusHours(long hoursToAdd)
LocalTime plusMinutes(long minutesToAdd)
LocalTime plusNanos(long nanosToAdd)
LocalTime plusSeconds(long secondstoAdd)

    plus를 minus로 바꾸면 minus 메서드가 된다.




날짜와 시간 비교

• int compareTo(ChronoLocalDate other)
    LocalDate와 LocalTime도 적절히 오버라이딩되어 있어 사용할 수 있다.
    같으면 0, 이전이면 -1, 이후면 1
LocalDate date1 = LocalDate.now();               // 2017-06-07
LocalDate date2 = LocalDate.of(2017, 06, 06);

System.out.println(date1.compareTo(date2));      // 1

• boolean isAfter(ChronoLocalDate other)
    other보다 이후 날짜인지 비교한다.
System.out.println(date1.isAfter(date2));        // true

• boolean isEqual(ChronoLocalDate other)
    연표chronology가 다른 두 날짜가 동일한지 비교한다.
    모든 필드가 일치해야 하는 equals()와 달리 오직 날짜만을 비교한다.
    LocalDate에만 있다.
import java.time.chrono.JapaneseDate;

LocalDate kDate = LocalDate.of(2017, 06, 05);
JapaneseDate jDate = JapaneseDate.of(2017, 06, 05);

System.out.println(kDate.equals(jDate));   // false
System.out.println(kDate.isEqual(jDate));  // true

• boolean isBefore(ChronoLocalDate other)
    other보다 이전 날짜인지 비교한다.
System.out.println(date1.isBefore(date2));      // false




toEpochDay()

Epoch Day인 '1970-01-01'부터 날짜/시간을 세어서 반환한다.
Period/Duration을 대신하여 두 날짜간의 일수 또는 시간 차이를 계산할 수 있다.
단, 날짜는 두 날짜 모두 Epoch Day 이후의 것이어야 한다.




•  참고 서적: 자바의 정석 3판 2