将Java转换为Scala的时间间隔

62

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

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

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

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

FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)

编辑:请注意,此行存在错误,这证明了这一点。请参见下面的选定答案。


这个解决方案有什么问题吗?这很简单易懂。如果你觉得它不够短,可以将其包装在一个函数中/创建一个隐式转换。 - kiritsuku
@sschaef 这个让人困扰的部分是一个所谓的“与scala兼容”的库,用于生成Java类型,但在涉及到Config时,这并不是什么新鲜事。 - Gabriele Petronella
Typesafe Config通过其项目定义为Java和Scala客户端提供服务。我同意使用隐式转换有点令人惊讶。我在MyConfig单例中进行了处理,因此应用程序代码将永远不需要知道。在应用程序级别的代码中不应该随意使用原始的Typesafe Config访问。 - akauppi
对于某些用途来说,将配置文件读取为特定单位(通常是毫秒)可能已经足够了。然后,只需使用'.toMillis'即可完成操作。这仍然允许配置文件提供任何对人类友好的单位。 - akauppi
4个回答

56

从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

53

我不知道是否显式转换是唯一的方法,但如果你想做到正确,请这样做。

FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS)
toNanos会返回总持续时间,而getNano只会返回纳秒组件,这并不是您想要的。
例如。
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")

23

我不知道有更好的方法,但你可以让它变得稍微短一些:

Duration.fromNanos(d.toNanos)

并且你需要将其包装为一个隐式转换

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

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


8

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接