long time= (getTime()/60000L) * 60000L
个
getTime()
将以毫秒为单位返回Unix时间.我正在利用组织,渴望勾销秒和米利斯.结果还必须采用Unix时间格式(分辨率最高可达Millis)
我想知道JVM是否会优化上面的代码以
long time= getTime()
个
但这将改变结果.
或者有没有更好、更干净的方法?(不能更改getTime的返回类型,它也是Long)
事先感谢您的帮助.
long time= (getTime()/60000L) * 60000L
个
getTime()
将以毫秒为单位返回Unix时间.我正在利用组织,渴望勾销秒和米利斯.结果还必须采用Unix时间格式(分辨率最高可达Millis)
我想知道JVM是否会优化上面的代码以
long time= getTime()
个
但这将改变结果.
或者有没有更好、更干净的方法?(不能更改getTime的返回类型,它也是Long)
事先感谢您的帮助.
将 comments 总结为社区维基答案:
如果JVM按照您所描述的方式"优化"该代码,那将是一个严重的错误.有意使用截断除法和其他类似操作是很常见的,优化它们将 destruct 代码的语义.因此,您现有的代码应该很好.
你问的是其他方式.至少有几个.
您可以做余数(% 60000L
)和减法,而不是除法和乘法,尽管这仍然会在代码中留下一个"幻数"(60000L
),您需要用注释或类似的方法来解释:
long time = getTime();
time = time - time % 60000L;
或者,您可以通过使用java.time.Instant
类来使时间语义变得明显:
long time = Instant.ofEpochMilli(getTime())
.truncatedTo(ChronoUnit.MINUTES)
.toEpochMilli();
(如果需要像当前代码一样,结果再次是Unix毫秒时间值,则只需要结尾的.toEpochMilli()
;否则,它将是Instant
实例).
但同样,当您can执行其中任何一个操作(可能还有其他操作)时,如果您不想更改代码,则不必更改代码.