Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting Java to Scala durations

Is there an elegant way to convert java.time.Duration to scala.concurrent.duration.FiniteDuration?

I am trying to do the following simple use of Config in Scala:

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

However I don't see any simple way to use the result in Scala. Certainly hope the good people of Typesafe didn't expect me to do this:

FiniteDuration(d.getNano, TimeUnit.NANOSECONDS)

Edit: Note the line has a bug, which proves the point. See the selected answer below.

like image 341
Jacob Eckel Avatar asked Aug 18 '15 15:08

Jacob Eckel


2 Answers

I don't know whether an explicit conversion is the only way, but if you want to do it right

FiniteDuration(d.toNanos, TimeUnit.NANOSECONDS) 

toNanos will return the total duration, while getNano will only return the nanoseconds component, which is not what you want.

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 

That being said, you can also roll your own implicit conversion

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

and when you have it in scope:

val d: FiniteDuration = ConfigFactory.load().getDuration("application.someTimeout") 
like image 102
Gabriele Petronella Avatar answered Oct 05 '22 13:10

Gabriele Petronella


Starting Scala 2.13, there is a dedicated DurationConverter from java's Duration to scala's FiniteDuration (and vice versa):

import scala.jdk.DurationConverters._  // val javaDuration = java.time.Duration.ofNanos(123456) javaDuration.toScala // scala.concurrent.duration.FiniteDuration = 123456 nanoseconds 
like image 34
Xavier Guihot Avatar answered Oct 05 '22 13:10

Xavier Guihot