Java中将当前时间转换为秒数的最优实现方式是什么?
Java获取当前纪元秒最优方案对比
结论
三种实现里最优的是long usingEpochSecond = Instant.now().getEpochSecond();,Java 8及以上版本没有更优的标准库实现。
三种方案优劣对比
方案1:
Instant.now().getEpochSecond()
这是Java 8引入的java.time新时间API的标准用法,优势非常明显:- 语义完全清晰,不需要做任何单位转换,不存在人为计算失误的风险
- 底层直接返回纪元秒数值,没有冗余计算步骤
Instant是不可变类,线程安全,完全规避了旧时间类的设计缺陷- 原生基于UTC时间计算,不存在时区歧义,返回结果全球统一
方案2:
TimeUnit.MILLISECONDS.toSeconds(new Date().getTime())
属于老旧API的兼容用法,存在明显劣势:- 依赖的
Date是Java 1.0时期的遗留类,本身可变、线程不安全,绝大多数方法已经被标记为废弃 - 多了创建
Date对象、毫秒转秒两步冗余操作,性能比方案1差 - 代码可读性不如方案1直观
- 依赖的
方案3:
new Date().getTime()/1000
不推荐使用,除了有方案2的所有缺陷之外,还存在额外风险:- 手动除法属于硬编码逻辑,可读性差,后续维护人员需要额外理解除以1000的含义
- 如果后续代码改动时变量类型处理不当,很容易出现整数溢出、精度损失问题
低版本Java兼容方案
如果你的项目还在使用Java 8以下的版本,最优的实现是:
long epochSecond = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
直接调用System.currentTimeMillis()避免了创建Date对象的开销,用TimeUnit做转换也规避了手动除法的风险。
内容的提问来源于stack exchange,提问作者AJ007
相关产品推荐
相关产品推荐

