将 Java 转换为 Scala 持续时间
Converting Java to Scala durations
有没有一种优雅的方法可以将 java.time.Duration
转换为 scala.concurrent.duration.FiniteDuration
?
我正在尝试在 Scala 中对 Config 进行以下简单使用:
val d = ConfigFactory.load().getDuration("application.someTimeout")
但是我没有看到任何在 Scala 中使用结果的简单方法。
当然希望 Typesafe 的好人没想到我会这样做:
FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)
编辑:注意该行有一个错误,这证明了这一点。请参阅下面的选定答案。
我不知道有什么更好的方法,但你可以把它缩短一点:
Duration.fromNanos(d.toNanos)
并自己将其包装成隐式转换
implicit def toFiniteDuration(d: java.time.Duration): FiniteDuration = Duration.fromNanos(d.toNanos)
(将 d.toNano
更改为 d.toNanos
)
我不知道显式转换是否是唯一的方法,但如果你想这样做就对了
FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS)
toNanos
将 return 总持续时间,而 getNano
将仅 return 纳秒分量,这不是您想要的。
例如
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")
从 Scala 2.13
开始,有一个专用的 DurationConverter
从 java 的 Duration
到 scala 的 FiniteDuration
(反之亦然):
import scala.jdk.DurationConverters._
// val javaDuration = java.time.Duration.ofNanos(123456)
javaDuration.toScala
// scala.concurrent.duration.FiniteDuration = 123456 nanoseconds
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
有没有一种优雅的方法可以将 java.time.Duration
转换为 scala.concurrent.duration.FiniteDuration
?
我正在尝试在 Scala 中对 Config 进行以下简单使用:
val d = ConfigFactory.load().getDuration("application.someTimeout")
但是我没有看到任何在 Scala 中使用结果的简单方法。 当然希望 Typesafe 的好人没想到我会这样做:
FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)
编辑:注意该行有一个错误,这证明了这一点。请参阅下面的选定答案。
我不知道有什么更好的方法,但你可以把它缩短一点:
Duration.fromNanos(d.toNanos)
并自己将其包装成隐式转换
implicit def toFiniteDuration(d: java.time.Duration): FiniteDuration = Duration.fromNanos(d.toNanos)
(将 d.toNano
更改为 d.toNanos
)
我不知道显式转换是否是唯一的方法,但如果你想这样做就对了
FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS)
toNanos
将 return 总持续时间,而 getNano
将仅 return 纳秒分量,这不是您想要的。
例如
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")
从 Scala 2.13
开始,有一个专用的 DurationConverter
从 java 的 Duration
到 scala 的 FiniteDuration
(反之亦然):
import scala.jdk.DurationConverters._
// val javaDuration = java.time.Duration.ofNanos(123456)
javaDuration.toScala
// scala.concurrent.duration.FiniteDuration = 123456 nanoseconds
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