프로그래밍 언어/Kotlin

Kotlin의 시간계산 : LocalDate, LocalDateTime, Duration

Julie825 2022. 11. 27. 15:32

LocalDate : 특정 지역의 연, 월, 일을 저장하기 위한 클래스. 계산도 가능하다. 일 단위 이하 연산이 불가능하다.

LocalDateTime : 특정 지역의 연, 월, 일, 시, 분, 초, 밀리초를 저장하기 위한 클래스. LocalDate로 전환할 수 있다.

 

문자열을 바꿀때는 DateTimeFormatter를 사용할 수 있다.

private val DATE_FORMATTER =
    DateTimeFormatter.ofPattern("yyyy:MM:dd:HH:mm:ss")
val text = "2022:11:27:13:50:00"
LocalDateTime.parse(text, DATE_FORMATTER)

 

만약 text가 ISO 공식 포맷을 따르는 경우 DateTimeFormatter의 프로퍼티를 그대로 사용한다.

DateTimeFormatter.ISO_DATE // '2011-12-03T10:15:30'
DateTimeFormatter.ISO_LOCAL_DATE // '2011-12-03'
DateTimeFormatter.ISO_DATE_TIME // '2011-12-03T10:15:30+01:00[Europe/Paris]'
DateTimeFormatter.ISO_LOCAL_DATE_TIME // '2011-12-03T10:15:30'

 

Duration : 그냥 Long이랑 뭔차인지 모르겠음. Number에서 바로 받을 수 있다.

// Duration 생성자는 private이어서 이렇게 구한다.
val secondsInLong = 30L
secondsInLong.seconds

 

딱히 Duration을 더해주는 메서드는 없어서 기본적인 plus 메서드들을 사용했다.

fun addDuration(date: LocalDateTime, duration: Duration): LocalDateTime{
    return date.plusSeconds(
    	duration.toLong(DurationUnit.SECONDS)
    )
}

 

Second 외의 단위도 더할 수 있다.

// public LocalDateTime plus(long amountToAdd, TemporalUnit unit)
// Unit에 ChronoUnit.NANOS 부터 ChronoUnit.ERAS, ChronoUnit.FOREVER 까지 넣을 수 있다.

/* 사용예시 */
val nextYear = LocalDateTime.now().plus(1L, ChronoUnit.YEARS)
val tenYearsLater = LocalDateTime.now().plus(1L, ChronoUnit.DECADES)

 

이때 LocalDate 객체에는 일 단위 이상부터 더할 수 있음에 주의하자.

val impossible = LocalDate.now().plus(30L, ChronoUnit.HOURS) // Unsupported unit Exception 발생

 

또 LocalDate, LocalDateTime 모두 immutable 객체여서, plus 등의 연산 결과로 새로운 객체가 반환된다.

val old = LocalDate.now() // hashCode : 4141787
val n = old.plusDays(1)   // hashCode : 4348635