2

java se / java ee 中是否有任何内置类表示任意“时间分辨率”;例如每小时、每秒、全部 10 分钟等 ?

4

4 回答 4

8

查看java.util.concurrent.TimeUnit枚举,您可以使用此处的单位。

不要重新发明轮子。

对于更复杂的时间操作,我建议使用Joda 时间库。

于 2012-09-15T15:22:55.713 回答
2

您总是可以减少时间的分辨率,例如

long millis = System.currentTimeMillis();
long seconds = millis / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;

所以如果你想要半小时,你可以使用

long halfHour = System.currentTimeMillis() / (30 * 60 * 1000L)
于 2012-09-15T15:18:31.740 回答
0

粒度单位

如果您的意思只是一种表示特定时间粒度的方法,例如小时、分钟和秒,那么Kremser 接受的答案是正确的。TimeUnit枚举正是这样。但是您还有另一种选择,它也内置在 Java 中。

ChronoUnit

请注意,Java 8 及更高版本具有类似但更长的值列表 injava.time.temporal.ChronoUnit与 7 相比TimeUnit

  • 永远
  • ERAS
  • 千年
  • 世纪
  • 几十年
  • 几个月
  • 周数
  • HALF_DAYS
  • 小时
  • 分钟
  • 米利斯
  • 微信
  • 纳诺斯

两个枚举TimeUnit&ChronoUnit都很方便。单位之间的转换通过TimeUnit多种方法提供。用它的方法ChronoUnit计算经过的时间。between

时钟增量

如果您希望时钟以特定增量滴答作响,Clock该类提供了替代实现。

在许多 java.time 类中将您的替代Clock实现对象作为可选参数传递,以代替默认时钟。

截断值

如果您有一个日期时间值并且想要截断它以将较小的字段降为零,请查看truncatedTo. 您使用接口指定粒度TemporalUnit,实现在ChronoUnit.

例如,获取当前时刻,去掉小数秒和秒以获取整分钟的值。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime nowWholeMinutes = now.truncatedTo( ChronoUnit.MINUTES );
于 2016-07-15T22:49:36.993 回答
-1

使用整数除法,很简单:

long millis = System.currentTimeMillis();

将以毫秒为单位为您提供当前时间。如果您想要一个值仅每resolution毫秒更改一次的时间(例如每 1000 毫秒),您可以使用整数除法:

long resolution = 1000;
long result = millis / resolution * resolution

如果您将毫秒除以结果,则在此示例中您将获得秒数。/进行整数除法,因为millisresolution都是整数变量。那将与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等。我猜你明白了。

于 2012-09-15T15:40:50.857 回答