如何解析含微秒的时间戳并实现微秒级递减?
如何正确解析带微秒的时间戳并递减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
相关产品推荐
相关产品推荐

