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
相关产品推荐
相关产品推荐

