java.util.concurrent.TimeUnit
java.util.concurrent.TimeUnit
早在以前的Java时代(1.5)就被引入,但从那时起,它已经被扩展了好几次。在这篇博文中,你将学习如何使用 ,将一个给定的
java.util.concurrent.TimeUnit
时间单位转换成一个持续时间。
前提条件
问题
解决方法
Java 11
-
:TimeUnit.convert(Duration duration)
long yearInMillis = TimeUnit.MILLISECONDS.convert(Duration.ofDays(365));
long hourInMillis = TimeUnit.MILLISECONDS.convert(Duration.ofHours(1));
long minuteInMillis = TimeUnit.MILLISECONDS.convert(Duration.ofMinutes(1));
-
使用 。TimeUnit.convert(Duration duration)
java.time.ChronoUnit
long yearInMillis = TimeUnit.MILLISECONDS.convert(Duration.of(365, TimeUnit.DAYS.toChronoUnit()));
long hourInMillis = TimeUnit.MILLISECONDS.convert(Duration.of(1, TimeUnit.HOURS.toChronoUnit()));
long minuteInMillis = TimeUnit.MILLISECONDS.convert(Duration.of(1, TimeUnit.MINUTES.toChronoUnit()));
前Java 11
- 通用的
TimeUnit.convert(long sourceDuration, TimeUnit sourceUnit)
long yearInMillis = TimeUnit.DAYS.toMillis(365);
long hourInMillis = TimeUnit.HOURS.toMillis(1);
long minuteInMillis = TimeUnit.MINUTES.toMillis(1);
-
,TimeUnit.toMillis(long duration)
等方法。TimeUnit.toSeconds(long duration)
long yearInMillis = TimeUnit.MILLISECONDS.convert(365, TimeUnit.DAYS);
long hourInMillis = TimeUnit.MILLISECONDS.convert(1, TimeUnit.HOURS);
long minuteInMillis = TimeUnit.MILLISECONDS.convert(1, TimeUnit.MINUTES);
最后的例子
class Java11TimeUnitConvertTests {
public static final long DAYS_IN_A_YEAR = 365L;
public static final long HOURS_IN_A_DAY = 24L;
public static final long MINUTES_IN_AN_HOUR = 60L;
public static final long SECONDS_IN_A_MINUTE = 60L;
public static final long MILLISECONDS_IN_A_SECOND = 1000L;
@Test
void aYearInMillis(){
// A year in milliseconds
long yearInMillis = TimeUnit.MILLISECONDS.convert(Duration.ofDays(365)); // since Java 11
assertThat(yearInMillis)
.isEqualTo(DAYS_IN_A_YEAR * HOURS_IN_A_DAY * MINUTES_IN_AN_HOUR * SECONDS_IN_A_MINUTE * MILLISECONDS_IN_A_SECOND)
.isEqualTo(TimeUnit.DAYS.toMillis(365))
.isEqualTo(TimeUnit.MILLISECONDS.convert(365, TimeUnit.DAYS))
.isEqualTo(TimeUnit.MILLISECONDS.convert(Duration.of(365, TimeUnit.DAYS.toChronoUnit()))); // since Java 11
}
@Test
void anHourInMillis(){
long hourInMillis = TimeUnit.MILLISECONDS.convert(Duration.ofHours(1)); // since Java 11
assertThat(hourInMillis)
.isEqualTo(MINUTES_IN_AN_HOUR * SECONDS_IN_A_MINUTE * MILLISECONDS_IN_A_SECOND)
.isEqualTo(TimeUnit.HOURS.toMillis(1))
.isEqualTo(TimeUnit.MILLISECONDS.convert(1, TimeUnit.HOURS))
.isEqualTo(TimeUnit.MILLISECONDS.convert(Duration.of(1, TimeUnit.HOURS.toChronoUnit()))); // since Java 11
}
@Test
void aMinuteInMillis(){
long minuteInMillis = TimeUnit.MILLISECONDS.convert(Duration.ofMinutes(1)); // since Java 11
assertThat(minuteInMillis)
.isEqualTo(SECONDS_IN_A_MINUTE * MILLISECONDS_IN_A_SECOND)
.isEqualTo(TimeUnit.MINUTES.toMillis(1))
.isEqualTo(TimeUnit.MILLISECONDS.convert(1, TimeUnit.MINUTES))
.isEqualTo(TimeUnit.MILLISECONDS.convert(Duration.of(1, TimeUnit.MINUTES.toChronoUnit()))); // since Java 11
}
@ParameterizedTest
@MethodSource("timeUnitToDuration")
void convertTimeUnitToDuration(TimeUnit unit, Duration duration, long expectedResult){
long actualResult = unit.convert(duration);
assertThat(actualResult).isEqualTo(expectedResult);
}
private static Stream<Arguments> timeUnitToDuration(){
return Stream.of(
Arguments.of(TimeUnit.DAYS, Duration.ofHours(24), 1), // 24h = 1d
Arguments.of(TimeUnit.DAYS, Duration.ofHours(40), 1), // 40h = 1d
Arguments.of(TimeUnit.DAYS, Duration.ofHours(48), 2), // 48h = 2d
Arguments.of(TimeUnit.DAYS, Duration.ofHours(50), 2), // 50h = 2d
Arguments.of(TimeUnit.MILLISECONDS, Duration.ofSeconds(1), 1000), // 1s = 1000ms
Arguments.of(TimeUnit.MILLISECONDS, Duration.ofSeconds(11), 11000), // 1s = 11000ms
Arguments.of(TimeUnit.SECONDS, Duration.ofHours(1), 3600), // 1h = 3600s
Arguments.of(TimeUnit.HOURS, Duration.ofSeconds(4_000), 1), // 4000s = 1h
Arguments.of(TimeUnit.HOURS, Duration.ofSeconds(1_0000), 2) // 10000s = 2h
);
}
}