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

Java日期字符串转换异常:yyyy-mm-dd转指定格式失败

问题排查与解决方案

为什么你的代码会抛出异常?

你遇到的问题主要有两个核心原因:

  • 解析时格式化器不匹配:你的输入字符串是"2018-03-20 09:31:31",格式是yyyy-MM-dd HH:mm:ss,但你却用了目标输出格式MM/dd/yyyy HH:mm:ss a的DateTimeFormatter去解析它,这就好比用英语字典查日语单词,完全匹配不上,直接导致解析失败抛出异常。
  • 错误选择了日期时间类:LocalDate只能存储日期部分(年/月/日),完全不包含时分秒和AM/PM这类时间信息,而你的输入字符串明明包含时分秒,用它来接收肯定不合适。

修正后的代码

下面是可以正常运行的代码,我会一步步解释逻辑:

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

public class DateConversionExample {
    public static void main(String[] args) {
        // 输入的原始日期字符串
        String dateString = "2018-03-20 09:31:31";
        
        // 第一步:用和输入字符串完全匹配的格式化器,解析成LocalDateTime对象
        DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH);
        LocalDateTime dateTime = LocalDateTime.parse(dateString, inputFormatter);
        
        // 第二步:用目标格式的格式化器,将LocalDateTime格式化为想要的字符串
        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss a", Locale.ENGLISH);
        String formattedDate = dateTime.format(outputFormatter);
        
        // 最终输出:03/20/2018 09:31:31 AM
        System.out.println(formattedDate);
    }
}

关键要点说明

  • 解析与格式化分离:解析字符串时,必须使用和输入格式完全一致的DateTimeFormatter;生成目标格式时,再切换为输出格式的格式化器,这是日期转换的核心原则。
  • 选对日期时间类:LocalDateTime可以完整存储年、月、日、时、分、秒信息,刚好匹配你的输入和输出需求,是最适合的类。
  • 指定英文Locale:因为输出格式包含a(表示AM/PM),指定Locale.ENGLISH可以确保上午/下午的标识是英文的,避免因系统默认地区设置导致的显示异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:18:36