将Java转换为Scala持续时间

时间:2015-08-18 15:15:42

标签: scala config duration scala-java-interop

是否有一种优雅的方法可以将java.time.Duration转换为scala.concurrent.duration.FiniteDuration

我正在尝试在Scala中进行以下简单的Config使用:

val d = ConfigFactory.load().getDuration("application.someTimeout")

但是,我没有看到在Scala中使用结果的任何简单方法。 当然希望Typesafe的好人不要指望我这样做:

FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)

编辑:注意该行有一个错误,这证明了这一点。请参阅下面的选定答案。

4 个答案:

答案 0 :(得分:42)

我不知道明确的转换是否是唯一的方法,但是如果你想做正确的话

FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS)

toNanos将返回总持续时间,而getNano将只返回纳秒组件,这不是您想要的。

E.g。

import java.time.Duration
import jata.time.temporal.ChronoUnit
Duration.of(1, ChronoUnit.HOURS).getNano // 0
Duration.of(1, ChronoUnit.HOURS).toNanos  // 3600000000000L

话虽如此,你也可以推出自己的隐式转换

implicit def asFiniteDuration(d: java.time.Duration) =
  scala.concurrent.duration.Duration.fromNanos(d.toNanos)

当你在范围内时:

val d: FiniteDuration = ConfigFactory.load().getDuration("application.someTimeout")

答案 1 :(得分:17)

我不知道更好的方法,但你可以把它缩短一点:

Duration.fromNanos(d.toNanos)

并自己将其包装成隐式转换

implicit def toFiniteDuration(d: java.time.Duration): FiniteDuration = Duration.fromNanos(d.toNanos)

(已将d.toNano更改为d.toNanos

答案 2 :(得分:3)

Scala 2.13开始,有一个专用的DurationConverter,从Java的Duration到scala的FiniteDuration(反之亦然):

import scala.jdk.DurationConverters.Ops._

// val javaDuration = java.time.Duration.ofNanos(123456)
javaDuration.toScala
// scala.concurrent.duration.FiniteDuration = 123456 nanoseconds

答案 3 :(得分:0)

scala-java8-compat中有一个为此功能

在build.sbt

libraryDependencies += "org.scala-lang.modules" %% "scala-java8-compat" % "0.9.0"
import scala.compat.java8.DurationConverters._

val javaDuration: java.time.Duration = ???
val scalaDuration: FiniteDuration = javaDuration.toScala