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

将Long型时间戳转为LocalDateTime时毫秒不显示的问题

解决Java 8时间戳转UTC格式时丢失毫秒的问题

问题根源

  1. LocalDateTime.toString()方法在毫秒值为0时会自动省略毫秒部分,导致后续解析后丢失毫秒信息,这是当前输出缺少.000的核心原因。
  2. 代码中多余的时区转换步骤不仅没必要,还增加了精度丢失的风险。

最优解决方案

直接从时间戳生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:00:53