java se / java ee 中是否有任何内置类表示任意“时间分辨率”;例如每小时、每秒、全部 10 分钟等 ?
4 回答
您总是可以减少时间的分辨率,例如
long millis = System.currentTimeMillis();
long seconds = millis / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
所以如果你想要半小时,你可以使用
long halfHour = System.currentTimeMillis() / (30 * 60 * 1000L)
粒度单位
如果您的意思只是一种表示特定时间粒度的方法,例如小时、分钟和秒,那么Kremser 接受的答案是正确的。TimeUnit
枚举正是这样。但是您还有另一种选择,它也内置在 Java 中。
ChronoUnit
请注意,Java 8 及更高版本具有类似但更长的值列表 injava.time.temporal.ChronoUnit
与 7 相比TimeUnit
:
- 永远
- ERAS
- 千年
- 世纪
- 几十年
- 年
- 几个月
- 周数
- 天
- HALF_DAYS
- 小时
- 分钟
- 秒
- 米利斯
- 微信
- 纳诺斯
两个枚举TimeUnit
&ChronoUnit
都很方便。单位之间的转换通过TimeUnit
多种方法提供。用它的方法ChronoUnit
计算经过的时间。between
时钟增量
如果您希望时钟以特定增量滴答作响,Clock
该类提供了替代实现。
Clock.tickSeconds
– 当前时间以整秒为单位递增。Clock.tickMinutes
– 当前时间以整分钟为单位递增。Clock.tick
– 当前时间以您指定的量递增
在许多 java.time 类中将您的替代Clock
实现对象作为可选参数传递,以代替默认时钟。
截断值
如果您有一个日期时间值并且想要截断它以将较小的字段降为零,请查看truncatedTo
. 您使用接口指定粒度TemporalUnit
,实现在ChronoUnit
.
例如,获取当前时刻,去掉小数秒和秒以获取整分钟的值。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime nowWholeMinutes = now.truncatedTo( ChronoUnit.MINUTES );
使用整数除法,很简单:
long millis = System.currentTimeMillis();
将以毫秒为单位为您提供当前时间。如果您想要一个值仅每resolution
毫秒更改一次的时间(例如每 1000 毫秒),您可以使用整数除法:
long resolution = 1000;
long result = millis / resolution * resolution
如果您将毫秒除以结果,则在此示例中您将获得秒数。/
进行整数除法,因为millis
和resolution
都是整数变量。那将与Math.floor(((float)millis) / ((float) resolution)))
. 如果现在乘以resolution
,则只有达到新的分辨率单位时,结果才会改变。
示例:假设您想要一个时钟,其时间仅在到达新的 5 分钟块时才会更改,因此块是例如 0-4 分钟、5-9 分钟、10-15 分钟等。5 分钟是 1000 毫秒/ 秒 * 60 秒/分钟 * 5 分钟 = 300000 毫秒。因此,如果您设置resolution = 300000
,result
每 5 分钟块只会更改一次。对于毫秒 = 0-299999,结果 = 0。对于millis = 300000-599999,result = 5等。我猜你明白了。