반응형
Scala는 기간 단위의 값을 제어하기 위해 scala.concurrent.duration 패키지에 Duration을 제공해줍니다 (실제 구현체는 FiniteDuration입니다)
Duration을 언어 차원에서 제공해주어 개발하기는 좋은데, scala 자체적인 날짜/시간 제어 라이브러리는 따로 제공해주지 않아 결국 java의 라이브러리를 사용하게 되고, Duration이 이 라이브러리들과 편하게 호환되지는 않아 상당히 불편합니다.
날짜/시간 라이브러리는 java.time 패키지를 사용하면 되는데 여기서 LocalDateTime을 Duration을 사용해 계산시키고 싶을 때는 아래 적은 코드처럼 사용하면 됩니다.
import java.time.{LocalDateTime, LocalTime, Duration => JavaDuration}
import scala.concurrent.duration._
import scala.language.postfixOps
val now = LocalDateTime.now().`with`(LocalTime.MIN)
// milliseconds로 계산
val scalaMilliSeconds = 3 millis
now.plus(JavaDuration.ofMillis(scalaMilliSeconds.toMillis))
now.minus(JavaDuration.ofMillis(scalaMilliSeconds.toMillis))
// seconds로 계산
val scalaSeconds = 5 seconds
now.plusSeconds(scalaSeconds.toSeconds)
now.minusSeconds(scalaSeconds.toSeconds)
// minutes로 계산
val scalaMinutes = 1 minutes
now.plusMinutes(scalaMinutes.toMinutes)
now.minusMinutes(scalaMinutes.toMinutes)
// hours로 계산
val scalaHours = 1 hours
now.plusHours(scalaHours.toHours)
now.minusHours(scalaHours.toHours)
// days로 계산
val scalaDays = 3 days
now.plusDays(scalaDays.toDays)
now.minusDays(scalaDays.toDays)
만약 이러한 conversion을 손으로 직접 작성하기 귀찮다면 implicit class를 만들어서 사용해도 됩니다.
import java.time.{LocalDateTime, Duration => JavaDuration}
import scala.concurrent.duration._
import scala.language.postfixOps
implicit class RichLocalDateTime(val localDateTime: LocalDateTime) extends AnyVal {
def +(duration: Duration): LocalDateTime = {
localDateTime.plus(JavaDuration.ofMillis(duration.toMillis))
}
def -(duration: Duration): LocalDateTime = {
localDateTime.minus(JavaDuration.ofMillis(duration.toMillis))
}
}
// 편리하게 +와 - 기호로 계산할 수 있습니다
println(LocalDateTime.now() + (1 days) + (2 hours))
println(LocalDateTime.now() - (1 days) - (1 hours))
반응형