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?
您可以使用静态方法Duration.of(long, TemporalUnit)。
它期望的金额为long, 和 a TemporalUnit,因此您需要将 TimeUnit 转换为 ChronoUnit。
static Duration convert(long dur, TimeUnit timeUnit) {\n return Duration.of(dur, timeUnit.toChronoUnit());\n}\nRun Code Online (Sandbox Code Playgroud)\n方法toChronoUnit()是在 JDK 版本 9 中引入的。
使用 Java 8,您可以转换TimeUnit为ChronoUnit使用ThreeTen库的实用方法Temporals.chronoUnit\xe2\x80\x8b(TimeUnit)。
如果您不想在项目中引入对此库的依赖,您可以使用Paul 的答案中提供的实用方法中提供的实用程序方法。
\n对于 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)
| 归档时间: |
|
| 查看次数: |
2631 次 |
| 最近记录: |