Java:时间分辨率

时间:2012-09-15 15:13:08

标签: java time

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

4 个答案:

答案 0 :(得分:8)

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

不要重新发明轮子。

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

答案 1 :(得分:2)

您可以随时降低时间分辨率,例如

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

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

long halfHour = System.currentTimeMillis() / (30 * 60 * 1000L)

答案 2 :(得分:0)

粒度单位

如果您只想表示某种时间粒度,例如小时与分钟与秒,accepted Answer by Kremser是正确的。 TimeUnit枚举就是这样。但是你还有另外一个内置于Java中的选择。

ChronoUnit

请注意,Java {8及更高版本在java.time.temporal.ChronoUnit中的值列表与TimeUnit中的七列值相似但更长:

  • 永久
  • ERAS
  • MILLENNIA
  • 世纪的
  • DECADES
  • YEARS
  • 个月
  • WEEKS
  • HALF_DAYS
  • HOURS
  • MINUTES
  • MILLIS
  • MICROS
  • NANOS

两个枚举,TimeUnit& ChronoUnit,很方便。单位之间的转换由TimeUnit以各种方法提供。 ChronoUnit使用between方法计算已用时间。

时钟增量

如果您希望时钟以某个增量进行勾选,Clock类提供了替代实现。

将备用Clock实现对象作为可选参数传递给许多java.time类,而不是使用默认时钟。

截断值

如果您有日期时间值并希望截断它以将较小的字段拖放到零,请查看truncatedTo。您可以使用TemporalUnit界面指定粒度,并在ChronoUnit中找到实现。

例如,获取当前时刻,降低秒数和秒数以获得整分钟的值。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime nowWholeMinutes = now.truncatedTo( ChronoUnit.MINUTES );

答案 3 :(得分:-1)

使用整数除法,简单:

long millis = System.currentTimeMillis();

将以毫秒为单位给出当前时间。 如果你想要一个值只改变每resolution毫秒(例如每1000毫秒)的时间,你可以使用整数除法:

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

如果将millis除以,则在此示例中将获得秒数。 /执行整数除法,因为millisresolution都是整数变量。这与Math.floor(((float)millis) / ((float) resolution)))相同。如果现在乘以resolution,结果只会在达到新的分辨率单位时发生变化。

示例:让我们假设您想要一个时钟,如果到达新的5分钟块时,时间只会改变,所以一个块例如0-4分钟,5-9分钟,10-15分钟等。 5分钟是1000毫秒/秒* 60秒/分钟* 5分钟= 300000毫秒。 因此,如果您设置resolution = 300000result将仅对每个5分钟块进行一次更改。 对于millis = 0-299999,结果= 0。对于millis = 300000-599999,结果= 5,等等。你猜对了。