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

如何将不同格式的时间字符串转换为DD.MM.YYYY格式?

如何将多种日期字符串格式转换为"DD.MM.YYYY"?

需求说明

需要将两种不同格式的日期字符串统一转换为dd.MM.yyyy(即"日.月.年",数字不足两位补0)格式:

  • 输入"Thu, 3 Nov 2022 06:00:00 +0100" → 输出"03.11.2022"
  • 输入"01.11.2022 20:00:00" → 输出"01.11.2022"
    所有输入均为String类型。

你之前代码的问题

  1. 模式字母误用:你用了DD和YYYY,但DD代表一年中的天数,YYYY代表基于周的周年,正确的日期和年份应该用dd和yyyy。
  2. 解析模式与输入不匹配:比如用DD.MM.YYYY去解析带时间或带星期、时区的字符串,格式完全不匹配,必然解析失败。
  3. 语法错误:第三段代码中parse方法的参数没有加引号,不是合法的字符串,直接编译报错。
  4. 过时API问题:SimpleDateFormat是Java 8之前的过时API,线程不安全,推荐使用java.time包下的类。

正确实现方案

使用Java 8及以上版本的java.time包(JSR-310),通过定义多个输入格式解析器,循环尝试解析输入字符串,成功后格式化为目标格式。

完整代码示例

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Arrays;
import java.util.List;

public class DateConverter {
    // 定义所有支持的输入格式对应的解析器
    private static final List<DateTimeFormatter> INPUT_FORMATTERS = Arrays.asList(
            // 处理带星期、时区的格式:Thu, 3 Nov 2022 06:00:00 +0100
            DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z"),
            // 处理带时间的日期格式:01.11.2022 20:00:00
            DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss")
    );
    // 目标输出格式
    private static final DateTimeFormatter OUTPUT_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yyyy");

    public static String convertToTargetFormat(String inputDate) {
        for (DateTimeFormatter formatter : INPUT_FORMATTERS) {
            try {
                // 解析为LocalDate,只保留日期部分
                LocalDate date = LocalDate.parse(inputDate, formatter);
                return date.format(OUTPUT_FORMATTER);
            } catch (DateTimeParseException e) {
                // 当前解析器不匹配,继续尝试下一个
                continue;
            }
        }
        // 所有格式都不匹配时抛出异常,也可根据需求返回默认值
        throw new IllegalArgumentException("不支持的日期格式:" + inputDate);
    }

    public static void main(String[] args) {
        // 测试两种输入格式
        System.out.println(convertToTargetFormat("Thu, 3 Nov 2022 06:00:00 +0100")); // 输出 03.11.2022
        System.out.println(convertToTargetFormat("01.11.2022 20:00:00")); // 输出 01.11.2022
    }
}

关键注意事项

  • 模式字母区分:
    • dd:月份中的天数(两位,如03),d是一位或两位(如3);DD是一年中的天数,不要混淆。
    • MM:两位月份(如11),MMM是月份缩写(如Nov);mm是分钟,注意不要搞混。
    • yyyy:四位公历年份,YYYY是基于周的周年,日常日期处理用yyyy即可。
  • 多格式兼容:通过循环遍历所有支持的解析器,确保每种输入格式都能被正确解析。
  • 线程安全:java.time包下的所有类都是不可变且线程安全的,适合在多线程环境中使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:05:34