如何将不同格式的时间字符串转换为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类型。
你之前代码的问题
- 模式字母误用:你用了
DD和YYYY,但DD代表一年中的天数,YYYY代表基于周的周年,正确的日期和年份应该用dd和yyyy。 - 解析模式与输入不匹配:比如用
DD.MM.YYYY去解析带时间或带星期、时区的字符串,格式完全不匹配,必然解析失败。 - 语法错误:第三段代码中
parse方法的参数没有加引号,不是合法的字符串,直接编译报错。 - 过时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
相关产品推荐
相关产品推荐

