java
Java - time package(LocalTime, LocalDate, LocalDateTime,...)
허원철
2017. 2. 7. 21:42
이번 글은 java 1.8에서 추가된 시간관련 패키지인 time 패키지에 대한 글 입니다.
기존 Date는 Deprecated 되어 권장하지 않습니다. 그 이후로 Calander를 이용하여 많이 작업을 합니다. 하지만 이 또한 자체 메소드로 지원이 적습니다. (Month가 0부터 시작하는.. 불편한 사항도 있었습니다.) 그래서 1.8부터는 time패키지에서 제공하는 LocalTime, LocalDate, LocalDateTime, ZoneDateTime을 이용하여 조금 더 편리하고 확장성 있게 코드를 작성 할 수 있습니다.
사용하면서 좋았던 점은 메소드명으로 쉽게 유추할 수 있는 메소드명들 이였습니다.
현재 시간
1 2 3 | LocalTime localTime = LocalTime.now(); // ex) 20:00:00 LocalDate localDate = LocalDate.now(); // ex) 2017-02-07 LocalDateTime localDateTime = LocalDateTime.now(); // 2017-02-07T20:00:00 | cs |
일정 값 주입
1 2 3 | LocalTime.of(20,0,0) // 20:00:00 LocalDate.of(2017, 2, 7) // 2017-02-07 LocalDateTime( LocalDate.of(2017, 2, 7), LocalTime.of(20,0,0) ) // 2017-02-07T20:00:00 | cs |
년, 월, 주, 일, 시, 분, 초
1 2 3 4 5 6 7 8 9 10 | LocalDateTime localDateTime = LocalDateTime.now() // 2017-02-07T20:00:00 localDateTime.getYear(); // 2017 localDateTime.getDayOfYear() // 38 (년 기준으로 38일째) localDateTime.getDayOfMonth() // 7 (달 기준으로 7일째) localDateTime.getDayOfWeek() // TUSEDAY (주 기준으로 화 요일) localDateTime.getMonth() // FEBRUARY localDateTime.getMonthValue() // 2 localDateTime.isLeapYear() // false (윤년 여부) | cs |
변경
- withXxxx( )를 이용하여 부분적으로 값을 변경 가능합니다.
1 2 | LocalDateTime localDateTime = LocalDateTime.now(); // 2017-02-07T20:00:00 localDateTime.withYear(2016) // 2016-02-07T20:00:00 | cs |
더하기, 빼기
-
xxxxYears( ), xxxxDays( ), xxxxHours( ), ... 등 으로 연산이 가능합니다.
1 2 3 4 5 | LocalDateTime localDateTime = LocalDateTime.now(); // 2017-02-07T20:00:00 localDateTime.plusDays(1) // 2017-02-08T20:00:00 localDateTime.minusDays(1) // 2017-02-06T20:00:00 | cs |
비교
- isAfter( ), isBefore( ), isEqual( )로 간단하게 비교 가능합니다.
- 앞을 기준으로 합니다.
1 2 3 4 5 | LocalDateTime localDateTime = LocalDateTime.now(); // 2017-02-07T20:00:00 LocalDateTime compareDateTime = localDateTime.plusDays(1) // 2017-02-08T20:00:00 localDateTime.isBefore(compareDateTime) // true | cs |
Period vs Duration
- Period와 Duration으로 날짜간에 차이값을 구할 수 있습니다.
- Period는 기간(년,월,일)을 구할 때 사용 할 수 있습니다.
- Duration은 Period보다 세세하게 시간, 분, 초 단위까지 가능합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | LocalDate localDate = LocalDateTime.now(); // 2017-02-07 LocalDate compareDate = localDate.plusDays(1) // 2017-02-08 // 1. Period period = localDateTime.until(compareDate) period.getDays() // 1 // 2. Period period = Period.between(locaDate, compareDate) period.getDays() // 1 LocalDateTime localDateTime = LocalDateTime.now() // 2017-02-07T20:00:00 LocalDateTime compareDateTime = localDateTime.plusDays(1) // 2017-02-08T20:00:00 Duration duration = Duration.between(localDateTime, compareDateTime) duration.toMinutes() // -1 * (24 * 60) -> 하루 차이를 분 단위로 표시 | cs |
Query
- 이 기능은 TemporalQuery<R>을 이용하여 커스텀한 기능을 가능하게 해줍니다. (
FuctionalInterface
)
1 2 3 4 5 6 7 8 9 10 11 12 | // ex) 2월이라면 참, 아니면 거짓 TemporalQuery<Boolean> query = t -> { if(t.get(ChronoField.MONTH_OF_YEAR) == Month.FEBRUARY.getValue()) { return true; } else { return false; } } LocalDateTime localDateTime = LocalDateTime.now() // 2017-02-07T20:00:00 localDateTime.query(query) // true | cs |
DateTimeFormatter
- 기존에는 형식 클래스인 SimpleDateFormat로 패턴을 변경했지만, DateTimeFormatter로 패턴을 변경할 수 있습니다.
1 2 3 | LocalDate localDate = LocalDate.of(2017, 2, 7) // 2017-02-07 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일") localDate.format(formatter) // 2017년 02월 07년 | cs |
참고
- 이외에도 TemporalAdjusters 를 이용하여 디테일한 날짜를 가져올 수 도 있습니다.
- 소스는 깃헙에 올려져 있으니 참고 하시면 되겠습니다. (Java8TimeAPI)
- https://docs.oracle.com/javase/tutorial/datetime/iso/index.html