如何从 long+TimeUnit 转换为 Duration?

Ada*_*ski 6 java java-8 timeunit java-time chronounit

我正在将一些签名从 迁移f(long dur, TimeUnit timeUnit)f(Duration duration),并希望用后者来实现前者。

在 Java 8 上,我找不到任何 API 可以轻松地将long+转换TU为 a Duration,我唯一的想法就是做一些丑陋的事情,例如:

static Duration convert(long dur, TimeUnit timeUnit) {
  switch (timeUnit) {
    case DAYS:
      return Duration.ofDays(dur);
    case HOURS:
      /* alternative, but (again) I don't have an easy conversion from TimeUnit -> ChronoUnit */
      return Duration.of(dur, ChronoUnit.HOURS);
    case ..... /* and so on */
  }
}
Run Code Online (Sandbox Code Playgroud)

或者我错过了一些API?

Ale*_*nko 9

Java 9+

\n

您可以使用静态方法Duration.of(long, TemporalUnit)

\n

它期望的金额为long, 和 a TemporalUnit,因此您需要将 TimeUnit 转换为 ChronoUnit

\n
static Duration convert(long dur, TimeUnit timeUnit) {\n    return Duration.of(dur, timeUnit.toChronoUnit());\n}\n
Run Code Online (Sandbox Code Playgroud)\n

方法toChronoUnit()是在 JDK 版本 9 中引入的。

\n

爪哇8

\n

使用 Java 8,您可以转换TimeUnitChronoUnit使用ThreeTen库的实用方法Temporals.chronoUnit\xe2\x80\x8b(TimeUnit)

\n

如果您不想在项目中引入对此库的依赖,您可以使用Paul 的答案中提供的实用方法中提供的实用程序方法。

\n

  • @AdamKotwasinski [ThreeTen](https://github.com/ThreeTen/ Threeten-extra) 库为此提供了一个实用方法,更新了答案。 (2认同)

Ada*_*ski 4

对于 Java 8,有一个迂回的解决方案:\(我们不必要从 TU -> millis(或任何单位)-> Duration 进行转换),如下所示:

long dur = ...
TimeUnit unit = ...
Duration result = Duration.ofMillis(unit.toMillis(dur));
Run Code Online (Sandbox Code Playgroud)

不过,请注意,对于非常大的值,Long.MAX_VALUE天数无法正确转换为(与尝试使用这样的值进行初始化时抛出的 ctorlong millis相比):Duration

final long millis = TimeUnit.DAYS.toMillis(Long.MAX_VALUE); // ouch
final Duration dur = Duration.ofMillis(dur);
System.err.println(dur.toDays() == Long.MAX_VALUE); // returns 'false'
Run Code Online (Sandbox Code Playgroud)