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

Java中如何生成对应UTC时间的Date对象?

问题解答

首先要明确一个关键事实:Date对象本身不存储任何时区信息,它本质上只是一个记录「自1970-01-01T00:00:00Z(UTC纪元时间)以来经过的毫秒数」的时间戳。

你当前的代码其实已经生成了对应UTC时间2023-03-22T08:46:38.562331200Z的Date对象——因为now.toInstant()就是UTC标准下的时间点,Date.from(now.toInstant())拿到的是完全一致的时间戳。你看到的Wed Mar 22 10:46:38 EET 2023,只是Date.toString()方法默认使用**系统本地时区(你的EET)**对时间戳进行格式化后的显示结果,并非Date对象本身的时间有误。

如果需要将这个时间点以UTC时区的格式输出,不能直接依赖Date.toString(),需要显式指定时区进行格式化:

方案1:使用Java 8+的DateTimeFormatter(推荐)

OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC);
Date date = Date.from(now.toInstant());

// 定义UTC时区的格式化器
DateTimeFormatter utcFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
        .withZone(ZoneOffset.UTC);
// 将Date转为Instant后用格式化器输出UTC字符串
String utcDateString = utcFormatter.format(date.toInstant());
System.out.println(utcDateString); // 输出:2023-03-22T08:46:38.562Z

方案2:使用旧版SimpleDateFormat

OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC);
Date date = Date.from(now.toInstant());

// 创建UTC时区的格式化对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
// 格式化Date为UTC时间字符串
String utcDateString = sdf.format(date);
System.out.println(utcDateString); // 输出:2023-03-22T08:46:38.562Z

简单来说:Date对象代表的是全球统一的时间点,时区只影响它的显示格式。只要你的Instant是从UTC的OffsetDateTime转换而来,对应的Date就已经是你想要的时间点,只是需要用指定时区的格式化工具来输出正确的UTC字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:18:23