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

如何在Java中按指定格式解析并转换日期?

Java 解析自定义日期字符串并转换为目标格式的解决方案

你之前尝试用java.util.Date date = Date.from(Instant.parse(minDates));失败,核心原因是Instant.parse()仅支持ISO-8601标准格式的日期字符串(比如2023-10-05T14:48:00Z),而你手头的Wed Jan 17 2001 00:00:00 GMT+0530是一种带时区偏移的自定义格式,必须用专门的日期格式化器来处理。

下面是基于Java 8及以上版本(推荐使用java.time新日期API,比旧的Date/Calendar更可靠)的完整实现方案:

步骤说明

  • 定义匹配输入格式的格式化器:根据你的输入字符串格式,指定对应的模式字符串,并设置英文Locale(因为星期、月份是英文缩写)。
  • 解析输入字符串为时区日期对象:用格式化器将字符串解析为ZonedDateTime,它能完整保留时区信息。
  • 格式化为目标字符串:将解析后的日期对象转换为你需要的yyyy-MM-dd'T'HH:mm:ss格式。

完整代码示例

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Locale;

public class DateConverter {
    public static void main(String[] args) {
        // 输入的日期字符串
        String inputDateStr = "Wed Jan 17 2001 00:00:00 GMT+0530";
        // 目标格式的模式
        String targetPattern = "yyyy-MM-dd'T'HH:mm:ss";

        try {
            // 定义输入格式的格式化器:匹配Wed Jan 17 2001 00:00:00 GMT+0530
            DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(
                "EEE MMM dd yyyy HH:mm:ss 'GMT'Z",
                Locale.ENGLISH // 必须指定英文Locale,避免系统默认Locale导致解析失败
            );

            // 解析输入字符串为ZonedDateTime
            ZonedDateTime zonedDateTime = ZonedDateTime.parse(inputDateStr, inputFormatter);

            // 格式化为目标格式的字符串
            String outputDateStr = zonedDateTime.format(DateTimeFormatter.ofPattern(targetPattern));

            System.out.println("转换后的日期:" + outputDateStr);
            // 输出结果:2001-01-17T00:00:00
        } catch (DateTimeParseException e) {
            System.err.println("日期解析失败:" + e.getMessage());
        }
    }
}

关键细节解释

  • 输入格式模式说明:
    • EEE:星期的英文缩写(比如Wed)
    • MMM:月份的英文缩写(比如Jan)
    • dd:两位数字的日期
    • yyyy:四位数字的年份
    • HH:mm:ss:24小时制的时分秒
    • 'GMT':字面量匹配字符串中的GMT部分
    • Z:时区偏移(比如+0530)
  • Locale.ENGLISH的必要性:如果你的系统默认Locale不是英文,解析英文缩写的星期/月份会失败,所以必须显式指定。
  • 为什么用ZonedDateTime:它能处理带时区的日期,确保解析时不会丢失时区信息,后续格式化也能保证时间的准确性。

如果你的项目还在使用Java 7或更早版本,可以用SimpleDateFormat来实现,但需要注意线程安全问题(SimpleDateFormat是非线程安全的),代码示例如下:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class LegacyDateConverter {
    public static void main(String[] args) {
        String inputDateStr = "Wed Jan 17 2001 00:00:00 GMT+0530";
        String targetPattern = "yyyy-MM-dd'T'HH:mm:ss";

        try {
            SimpleDateFormat inputSdf = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'Z", Locale.ENGLISH);
            Date date = inputSdf.parse(inputDateStr);

            SimpleDateFormat targetSdf = new SimpleDateFormat(targetPattern);
            String outputDateStr = targetSdf.format(date);

            System.out.println("转换后的日期:" + outputDateStr);
        } catch (ParseException e) {
            System.err.println("日期解析失败:" + e.getMessage());
        }
    }
}

不过还是强烈建议升级到Java 8+,使用java.time包的API,它设计更合理,线程安全,功能更强大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:41:18