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

如何解析含微秒的时间戳并实现微秒级递减?

如何正确解析带微秒的时间戳并递减1微秒?

你遇到的问题核心在于SimpleDateFormat和Date类本身只支持毫秒级精度(最多3位小数),所以输入字符串里的后三位微秒会被直接忽略,导致处理后丢失这部分信息。要解决这个问题,推荐使用Java 8及以后版本引入的java.time包——这套新的日期时间API原生支持纳秒级精度,完全能满足你的需求。

具体实现步骤

  • 第一步:定义匹配输入格式的DateTimeFormatter,注意格式符要用SSSSSS来匹配6位的毫秒+微秒部分
  • 第二步:将输入字符串解析为LocalDateTime对象(它支持纳秒精度,能完整保留所有时间信息)
  • 第三步:对LocalDateTime执行减1微秒操作
  • 第四步:用同一个格式化器将结果输出为目标格式

完整代码示例

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.Duration;

public class TimestampAdjuster {
    public static void main(String[] args) {
        // 定义匹配输入格式的格式化器
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH.mm.ss.SSSSSS");
        
        String source = "2018-15-05-23.59.59.999123";
        // 解析为LocalDateTime,完整保留微秒信息
        LocalDateTime sourceTime = LocalDateTime.parse(source, formatter);
        
        // 递减1微秒(两种写法都可以,选你觉得直观的)
        LocalDateTime targetTime = sourceTime.minus(Duration.ofMicros(1));
        // 或者用 sourceTime.minusNanos(1000); 因为1微秒=1000纳秒
        
        // 格式化为目标字符串
        String target = targetTime.format(formatter);
        System.out.println(target); // 输出:2018-15-05-23.59.59.999122
    }
}

额外说明

  • 如果你的项目还停留在Java 7,那可以考虑使用Joda-Time库(它是java.time的前身,同样支持微秒精度),但更建议升级到Java 8+,毕竟老的日期API不仅有精度问题,还有线程不安全、设计不合理等诸多弊端。
  • 注意输入字符串里的15是月份吗?如果是月份的话,这里其实不符合实际范围(月份为1-12),但代码逻辑本身不受影响,只要输入格式和格式化器匹配即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:58:45