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

求助:无法将java.util.Date转换为指定格式的问题

问题核心:java.util.Date 本身没有格式

java.util.Date本质上只是存储毫秒数的对象(记录从1970-01-01T00:00:00 UTC到目标时间的毫秒差),它不存储任何格式信息。你看到的Wed Oct 11 10:00:00 CDT 2023只是Date.toString()方法默认输出的格式,并非对象本身的属性。

你的尝试(转成字符串再转回Date)之所以没用,是因为转回后的Date对象还是原来的毫秒数,调用toString()自然还是默认格式——你并没有改变Date的本质,只是做了一次字符串的来回转换。


正确解决方案:将Date转成目标格式的字符串

你的需求是得到2023-10-11T10:00:00.000Z格式的输出,这本质是把Date对象转换成符合ISO 8601规范的字符串(Z代表UTC时区),分两种实现方式:

1. 使用Java 8+ 推荐的 java.time API(优先选择)

旧的Date/SimpleDateFormat存在线程不安全、设计缺陷等问题,Java 8及以上推荐使用java.time包下的类:

场景1:将CDT时间转换为UTC时区的ISO字符串(符合Z的规范)

CDT是UTC-5时区,10:00 CDT对应15:00 UTC,转换代码:

Date utilDate = new Date(); // 你的输入Date对象
// 将Date转为UTC时间戳Instant
Instant instant = utilDate.toInstant();
// 用预定义的ISO_INSTANT格式器输出
String formattedString = DateTimeFormatter.ISO_INSTANT.format(instant);
System.out.println(formattedString); // 输出类似:2023-10-11T15:00:00.000Z

场景2:保留原时区时间,仅套用Z格式(不推荐,不符合Z的时区定义,但匹配你的示例)

如果只是想要格式而不做时区转换,可指定原时区:

Date utilDate = new Date();
// 将Date转为芝加哥时区(CDT对应的时区)的ZonedDateTime
ZonedDateTime zdt = utilDate.toInstant().atZone(ZoneId.of("America/Chicago"));
// 自定义格式输出
String formattedString = zdt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
System.out.println(formattedString); // 输出:2023-10-11T10:00:00.000Z

2. 使用旧的 SimpleDateFormat(兼容Java 8以下)

如果必须用旧API,需要设置时区并指定格式字符串:

Date utilDate = new Date();
// 定义目标格式,注意'T'和'Z'需要用单引号包裹转义
SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
// 如果要输出UTC时间,设置时区为UTC
isoFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
// 或者要保留CDT时区,设置为芝加哥时区:isoFormat.setTimeZone(TimeZone.getTimeZone("America/Chicago"));
String formattedString = isoFormat.format(utilDate);
System.out.println(formattedString);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:30:27