[Java] Class LocalDate, LocalTime
Javapackage 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 이후의 것이어야 한다.
참고 서적: 자바의 정석 3판 2