Java中的时间常量?

2022-08-31 10:54:18

有没有一个Java包具有所有令人讨厌的时间常数,例如一分钟/小时/天/一年中毫秒/秒/分钟?我不想复制这样的东西。


答案 1

我会使用java TimeUnit,如果你还没有在你的项目中包括joda-time。您不需要包含外部库,而且它非常简单。

每当您需要这些“烦人的常量”时,您通常需要它们来混合一些数字以进行跨单元转换。相反,您可以使用 TimeUnit 简单地转换值,而无需显式乘法。

这:

long millis = hours * MINUTES_IN_HOUR * SECONDS_IN_MINUTE * MILLIS_IN_SECOND;

变成这个:

long millis = TimeUnit.HOURS.toMillis(hours);

如果你公开了一个接受一些值的方法,比如说,millis,然后需要转换它,那么最好遵循java并发API的作用:

public void yourFancyMethod(long somePeriod, TimeUnit unit) {
    int iNeedSeconds = unit.toSeconds(somePeriod);
}

如果你真的非常需要常量,你仍然可以通过调用以下命令在一小时内获得几秒钟:

int secondsInHour = TimeUnit.HOURS.toSeconds(1);

答案 2

Java 8 / java.time 解决方案

作为 的替代方法,您可能出于某种原因更喜欢 java.time 包中的 Duration 类:TimeUnit

Duration.ofDays(1).getSeconds()     // returns 86400;
Duration.ofMinutes(1).getSeconds(); // 60
Duration.ofHours(1).toMinutes();    // also 60
//etc.

此外,如果您更深入地分析了 Duration.ofDays(..) 方法的工作原理,您将看到以下代码:

return create(Math.multiplyExact(days, SECONDS_PER_DAY), 0);

其中 是来自 LocalTime 类的受包保护的静态常量。SECONDS_PER_DAY

/**
 * Seconds per day.
 */
static final int SECONDS_PER_DAY = SECONDS_PER_HOUR * HOURS_PER_DAY;

//there are also many others, like HOURS_PER_DAY, MINUTES_PER_HOUR, etc.

我认为可以安全地假设,如果有任何软件包,它会定义“所有令人讨厌的时间常数,如毫秒/秒/分钟”,我相信Java SDK开发人员会使用它们。

为什么这个常量包受到保护而不是公开,这是一个好问题,我相信这是有原因的。就目前而言,看起来您真的必须复制它们并自行维护。LocalTime