You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改System.currentTimeMillis()值,清零秒与毫秒获取上一分钟起始时刻?

解决方案:用java.time API优雅实现时间戳截断到上一分钟起始时刻

没问题,用Java 8及以上版本的java.time API可以完美解决这个需求,全程不需要使用任何魔法常量(比如手动写60*1000这种容易出错的数值),代码清晰且可读性强。

核心思路

把原始时间戳转换为Instant(代表UTC时间线上的一个精确点),再转换为带时区的日期时间对象,通过truncatedTo()方法直接截断到分钟级别——这个方法会自动将秒、毫秒部分清零,最后再转换回long类型的时间戳即可。

完整代码示例

// 假设这是你持有的原始时间戳
long originalMillis = System.currentTimeMillis();

// 1. 将时间戳转为Instant
Instant instant = Instant.ofEpochMilli(originalMillis);

// 2. 转换为带时区的日期时间(这里用系统默认时区,也可指定UTC等)
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());

// 3. 截断到分钟,自动清零秒和毫秒
ZonedDateTime startOfTargetMinute = zonedDateTime.truncatedTo(ChronoUnit.MINUTES);

// 4. 转换回long类型时间戳
long targetMillis = startOfTargetMinute.toInstant().toEpochMilli();

简化版一行代码

如果追求简洁,可以把上述步骤合并为一行:

long targetMillis = Instant.ofEpochMilli(System.currentTimeMillis())
        .atZone(ZoneId.systemDefault())
        .truncatedTo(ChronoUnit.MINUTES)
        .toInstant()
        .toEpochMilli();

额外说明

  • 如果需要UTC时区的结果(不受系统时区影响),只需要把ZoneId.systemDefault()替换为ZoneOffset.UTC即可。
  • truncatedTo(ChronoUnit.MINUTES)是java.time API提供的标准方法,内部已经处理了所有时间单位的截断逻辑,完全避免了手动计算可能带来的错误。

内容的提问来源于stack exchange,提问作者alamar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:11:54