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执行其中任何一个操作(可能还有其他操作)时,如果您不想更改代码,则不必更改代码.

Java相关问答推荐

使用log 4j2格式的Hibernate 显示SQL日志(log)

我可以在regex中的字符类中放置断言吗?

使用Apache Poi MQLSlideShow,在XSLFTable表中,我们可以在文本段落后面的每个单元格中包含圆角矩形吗?

@ EnableRouting注释在Kotlin项目中不工作

CSS应用于一个端点,但不应用于Thymeleaf中的另一个端点

SQlite for Android无法使用json_group_array/json_object

如何以干净的方式访问深度嵌套的对象S属性?

Kubernetes的Java客户端检索状态.处于终止状态的Pod的阶段';正在运行';

使用Spring Boot3.2和虚拟线程的并行服务调用

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

使用存储在字符串变量中的路径目录打开.pdf文件

将PNG转换为位图自定义十六进制字符串

try 在Android Studio中的infoWindow中使用EditText(Java)

如何使用路径过渡方法使 node 绕圆旋转?

使用Jackson库反序列化json

如何配置空手道以使用FeignClient或RestTemplate代替ApacheHttpClient

我该如何为我的类编写getter和setter方法?

无限递归Java问题

[jdk21][Foreign Function&;Memory API]MemoryLayout::varHandle通过可变数组进行 struct 化的问题

Hibernate 命名策略导致 Java Spring Boot 应用程序中出现未知列错误