将Long型时间戳转为LocalDateTime时毫秒不显示的问题
解决Java 8时间戳转UTC格式时丢失毫秒的问题
问题根源
LocalDateTime.toString()方法在毫秒值为0时会自动省略毫秒部分,导致后续解析后丢失毫秒信息,这是当前输出缺少.000的核心原因。- 代码中多余的时区转换步骤不仅没必要,还增加了精度丢失的风险。
最优解决方案
直接从时间戳生成Instant,用指定格式的DateTimeFormatter格式化,一步到位:
long modified = 1636334664000L; Instant instant = Instant.ofEpochMilli(modified); // 定义包含毫秒的UTC格式器 DateTimeFormatter utcFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") .withZone(ZoneOffset.UTC); String formattedTime = utcFormatter.format(instant); System.out.println(formattedTime); // 输出:2021-11-08T01:24:24.000Z
保留原有转换逻辑的修正方案
如果必须保留LocalDateTime的转换流程,需要用显式的格式化器替代默认的toString():
long modified = 1636334664000L; LocalDateTime ldt = LocalDateTime.ofInstant( Instant.ofEpochMilli(modified), ZoneId.systemDefault()); // 定义包含毫秒的格式化规则 DateTimeFormatter msFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"); // 用格式化器输出再解析,避免丢失毫秒 LocalDateTime dateTime = LocalDateTime.parse(ldt.format(msFormatter), msFormatter); Instant insStr = dateTime.atZone(ZoneId.systemDefault()) .withZoneSameInstant(ZoneOffset.UTC) .toInstant(); // 最后格式化Instant到目标格式 String result = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") .withZone(ZoneOffset.UTC) .format(insStr); System.out.println(result); // 输出:2021-11-08T01:24:24.000Z
关键提示
- 永远不要依赖
LocalDateTime或Instant的默认toString()方法生成指定格式的时间字符串,显式指定格式化规则才是可靠的做法。 - 处理UTC时间时,直接使用
Instant配合ZoneOffset.UTC的格式化器是最简洁且不易出错的方式。
内容的提问来源于stack exchange,提问作者Ramesh
相关产品推荐
相关产品推荐

