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

无法识别YYYY-MM-DDTHH:MM:SS.fff格式类型,Java解析报错求助

问题分析与修复方案

首先,你的日期字符串 2018-01-30T23:59:59.000 是ISO 8601标准的日期格式,这个格式本身不带时区标识(比如Z代表UTC时间),所以默认会解析为本地时区的时间,你也可以手动指定时区来处理。

接下来看你遇到的解析异常问题——你的SimpleDateFormat格式字符串写错了好几处,这才是核心原因:

  • 用了YYYY而不是yyyy:YYYY表示的是基于周的年份,和我们常用的公历年不是一回事,必须换成yyyy
  • 用了DD而不是dd:DD是一年中的第几天,你要的是当月的第几天,所以得用dd
  • 分钟部分写了MM:MM是月份的格式符,分钟应该用mm
  • 秒和毫秒的格式错误:原字符串里毫秒是用.分隔的,你写成了:;而且毫秒的格式符是SSS,秒是ss,不是你写的SS:MS

修正后的SimpleDateFormat代码应该是这样的:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
Date date = null;
try {
    date = sdf.parse("2018-01-30T23:59:59.000");
    System.out.println(date); // 输出对应本地时区的时间
} catch (ParseException e) {
    e.printStackTrace();
}

另外,如果你的项目用的是Java 8或更高版本,强烈建议你使用java.time包下的新日期API——它是线程安全的,设计也更合理,避免了SimpleDateFormat的诸多坑。示例代码如下:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateParser {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
        LocalDateTime dateTime = LocalDateTime.parse("2018-01-30T23:59:59.000", formatter);
        System.out.println(dateTime);
    }
}

要是需要处理时区(比如明确按UTC解析),可以用ZonedDateTime:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.ZoneId;

public class ZonedDateParser {
    public static void main(String[] args) {
        // 给原字符串补上UTC时区标识,或者直接指定时区解析
        String dateStr = "2018-01-30T23:59:59.000Z"; // Z代表UTC
        DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateStr, formatter);
        System.out.println(zonedDateTime);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:57:13