[Java] Class LocalDate, LocalTime

Java

(Update : 2017-09-18)

Language :

package java.time

Date와 Calendar가 가지고 있던 단점들을 개선한 패키지.

4개의 하위 패키지를 가지고 있다.

날짜나 시간을 변경하는 메서드들은 항상 변경된 새로운 객체를 반환한다. = 불변Immutable

Class 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, 09, 03);                    // 2017-09-03
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-09-03");       // 2017-09-03
LocalTime time = LocalTime.parse("17:41:30");         // 17:41:30

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

Calendar와 달리 월(month)의 범위가 1~12고, 요일은 월요일 1 ~ 일요일 7이다.

  • LocalDate
반환 타입메서드 이름설명2017-09-03
  int  getYear()  년도  2017
  int  getMonthValue()   월  9
  Month  getMonth()   월  SEPTEMBER. getMonth().getValue()=9
  int  getDayOfMonth()  일  3
  int  getDayOfYear()  같은 해의 1월 1일부터 몇 번째 일  246
 DayOfWeek  getDayOfWeek()  요일  SUNDAY. getDayOfWeek().getValue()=7
  int  lengthOfMonth()  같은 달의 총 일수  30
  int  lengthOfYear()  같은 해의 총 일수. 윤년이면 366  365
  boolean  isLeapYear()  윤년여부 확인  false
  • LocalTime
반환 타입메서드 이름설명2017-09-03 23:09:53
  int  getHour()  시  23
  int  getMinute()  분  9
  int  getSecond()  초  53
  int  getNano()  나노초  598000000

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

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

import java.time.temporal.ChronoField;

LocalDate data = LocalDate.now();
System.out.println(data.get(ChronoField.ERA));
System.out.println(data.getLong(ChronoField.EPOCH_DAY));
  • LocalDate - int get(TemporalField field)
TemporalField(ChronoField)설명2017-09-03
  ERA  시대  1
  YEAR_OF_ERA  년  2017
  YEAR  년  2017
  MONTH_OF_YEAR  월  9
  DAY_OF_WEEK  요일(1:월, 2:화 … 7:일)  7
  DAY_OF_MONTH  일  3
  DAY_OF_YEAR  그 해의 몇 번째 날  246
  ALIGNED_WEEK_OF_MONTH  그 달의 n번째 주(1~7일 1주, 8~14일 2주, …)  1
  ALIGNED_WEEK_OF_YEAR  그 해의 n번째 주(1월 1~7일 1주, 8~14일 2주, …)  36
  ALIGNED_DAY_OF_WEEK_IN_MONTH  요일 (그 달의 1일을 월요일로 간주하여 계산)  3
  ALIGNED_DAY_OF_WEEK_IN_YEAR  요일 (그 해의 1월 1일을 월요일로 간주하여 계산)  1
  • LocalDate - long getLong(TemporalField field)
TemporalField(ChronoField)설명2017-09-03
  EPOCH_DAY  EPOCH(1970.1.)부터 몇 번째 날  17412
  • 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()

     특정 필드에 값을 더하거나 뺀다.

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

LocalTime plus(TemporalAmount amountToAdd)
LocalTime plus(long amountToAdd, TemporalUnit unit)
LocalTime plusHours(long hoursToAdd)
LocalTime plusMinutes(long minutesToAdd)
LocalTime plusNanos(long nanosToAdd)
LocalTime plusSeconds(long secondstoAdd)
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)

날짜와 시간 비교

  • int compareTo(ChronoLocalDate other)

     LocalDate와 LocalTime도 적절히 오버라이딩되어 있어 사용할 수 있다.

     같으면 0, 이전이면 -1, 이후면 1

LocalDate date1 = LocalDate.now();               // 2017-09-03
LocalDate date2 = LocalDate.of(2017, 9, 17);

System.out.println(date1.compareTo(date2));      // -14
  • 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, 9, 03);
JapaneseDate jDate = JapaneseDate.of(2017, 9, 03);

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 이후의 것이어야 한다.

LocalDate API

LocalTime API

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

민갤

Back-End Developer

백엔드 개발자입니다.