Java:时间分辨率
JavaSE/JavaEE中是否有任何表示任意“时间分辨率”的内置类;e、 g每小时、每秒钟、所有10分钟等?您始终可以降低时间分辨率,例如Java:时间分辨率,java,time,Java,Time,JavaSE/JavaEE中是否有任何表示任意“时间分辨率”的内置类;e、 g每小时、每秒钟、所有10分钟等?您始终可以降低时间分辨率,例如 long millis = System.currentTimeMillis(); long seconds = millis / 1000; long minutes = seconds / 60; long hours = minutes / 60; 所以,如果你想每半小时一次,你可以使用 long halfHour = System.current
long millis = System.currentTimeMillis();
long seconds = millis / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
所以,如果你想每半小时一次,你可以使用
long halfHour = System.currentTimeMillis() / (30 * 60 * 1000L)
看看enum,你可以使用这里的单位
不要重新发明轮子
对于更复杂的时间运算,我建议使用库。使用整数除法,它很简单:
long millis=System.currentTimeMillis()代码>
将以毫秒为单位显示当前时间。
如果希望某个时间的值仅在每<代码>分辨率代码>毫秒(例如每1000毫秒)更改一次,则可以使用整数除法:
long resolution = 1000;
long result = millis / resolution * resolution
如果你用结果除以毫秒,在这个例子中你会得到秒/
进行整数除法,因为毫
和分辨率
都是整数变量。这将与数学地板(((浮点)毫秒)/((浮点)分辨率))相同。
。如果现在乘以分辨率
,则仅当达到新的分辨率单位时,结果才会改变
示例:假设您想要一个时钟,其时间只有在达到新的5分钟块时才会改变,因此块为0-4分钟、5-9分钟、10-15分钟等。
5分钟是1000毫秒/秒*60秒/分钟*5分钟=300000毫秒。
因此,如果您设置分辨率=300000
,结果将仅为每5分钟一个区块更改一次。
对于毫秒=0-299999,结果=0。对于millis=300000-599999,result=5,等等,我想你应该知道了。粒度单位
如果您的意思只是一种表示特定时间粒度的方法,例如小时与分钟与秒,那么这个方法是正确的。TimeUnit
enum就是这个。但您还有另一个选择,它也内置在Java中
ChronoUnit
请注意,Java 8及更高版本中的值列表与时间单位中的七个值相似,但更长:
- 永远
- 年代
- 千年
- 世纪
- 几十年
- 年头
- 月份
- 周
- 日子
- 半天
- 小时数
- 会议记录
- 秒
- 米利斯
- 微秒
- 纳米
这两个枚举,TimeUnit
和ChronoUnit
,都很方便。TimeUnit
以各种方式提供单位之间的转换ChronoUnit
使用其方法计算经过的时间
时钟增量
如果您希望时钟以特定的增量滴答作响,则该类提供了替代实现
- –当前时间以整秒为单位递增
- –以整分钟为单位的当前时间增量
- –当前时间以您指定的数量递增
在许多java.time类中,将替代的时钟
实现对象作为可选参数传递,以代替默认时钟
截断值
如果您有一个日期时间值,并且希望截断它以将较小的字段降为零,请查看。您可以使用接口和中的实现来指定粒度
例如,获取当前时刻,删除秒和秒的分数,以获得整分钟的值
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime nowWholeMinutes = now.truncatedTo( ChronoUnit.MINUTES );
你想完成什么?为定期执行安排任务?@JoaoSilva不,实际上我必须将这样的时间分辨率传递给服务,以便它可以对一组数据执行业务逻辑。这篇文章可能会引起您的兴趣:整数除法对于Joda来说要简单得多+1-时间单位的问题是,正如名字所说,它仅指定单位-单位数量必须单独指定。Joda的句点和持续时间类听起来很接近@Paranix想要的。@user3001:整数除法可能更简单,但时间单位是.MINUTES.toMillis(5),读起来肯定更好,意图也更清楚。@PeterŠtibraný我不清楚toMillis(5)中的5是毫秒还是纳秒或小时,据我所知,它可能返回0;)@彼得拉维:它是(5)分钟到毫秒,和你读到的完全一样:-)