허원철의 개발 블로그

Java - time package(LocalTime, LocalDate, LocalDateTime,...) 본문

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(201727// 2017-02-07
LocalDateTime( LocalDate.of(201727), 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(201727// 2017-02-07
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일")
localDate.format(formatter) // 2017년 02월 07년
cs



참고

- 이외에도 TemporalAdjusters 를 이용하여 디테일한 날짜를 가져올 수 도 있습니다.

- 소스는 깃헙에 올려져 있으니 참고 하시면 되겠습니다. (Java8TimeAPI)


- http://blog.eomdev.com/java/2016/04/01/%EC%9E%90%EB%B0%948%EC%9D%98-java.time-%ED%8C%A8%ED%82%A4%EC%A7%80.html

- https://docs.oracle.com/javase/tutorial/datetime/iso/index.html

'java' 카테고리의 다른 글

Java - Compare GC  (406) 2017.03.07
Java - GC (Garbage Collection)  (420) 2017.03.05
Java - Optional API  (415) 2017.02.19
Java - JUnit & AssertJ  (406) 2016.12.05
Java - Stream API  (404) 2016.12.05
Comments