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

使用tPOP获取Gmail邮件后,如何转换日期为java.util.Date?

解决Gmail日期转java.util.Date的问题

我刚好处理过类似的需求,Gmail返回的这个日期格式其实不难解析,关键是要匹配对格式模式,还要注意时区和本地化的细节,下面给你两种可行的方案:

方案一:使用传统的SimpleDateFormat

这是最直接的方式,针对Gmail的日期格式,我们可以定义对应的格式模式,还要指定英文Locale(避免非英文系统下解析月份/星期缩写失败):

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

public class GmailDateParser {
    public static void main(String[] args) {
        // Gmail返回的原始日期字符串
        String gmailDateStr = "Fri, 13 Apr 2018 02:26:19 -0700 (PDT)";
        
        // 先去掉末尾的时区名称(括号里的部分),避免解析干扰
        String cleanedDateStr = gmailDateStr.replaceAll("\\(.*\\)", "").trim();
        
        // 定义匹配的格式模式:EEE(星期缩写), dd(日), MMM(月份缩写), yyyy(年), HH:mm:ss(时分秒), Z(时区偏移)
        SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.US);
        
        try {
            Date date = sdf.parse(cleanedDateStr);
            System.out.println("转换后的Date对象:" + date);
        } catch (ParseException e) {
            e.printStackTrace();
            // 这里可以加异常处理逻辑,比如日志记录或者提示解析失败
        }
    }
}

关键细节说明:

  • Locale.US必须指定:因为Gmail的日期是英文缩写(Fri、Apr),如果系统默认Locale是中文或其他非英文,解析会直接抛出ParseException。
  • 去掉括号内的时区名称:(PDT)属于附加信息,SimpleDateFormat的Z模式已经能解析-0700这个时区偏移,所以提前移除这部分能避免解析时的潜在问题。

方案二:Java 8+ 推荐的DateTimeFormatter(更健壮)

如果你的项目用的是Java 8或更高版本,更推荐用新的日期时间API来解析,然后再转成java.util.Date:

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

public class ModernGmailDateParser {
    public static void main(String[] args) {
        String gmailDateStr = "Fri, 13 Apr 2018 02:26:19 -0700 (PDT)";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z (zzz)", Locale.US);
        
        // 解析成ZonedDateTime
        ZonedDateTime zonedDateTime = ZonedDateTime.parse(gmailDateStr, formatter);
        
        // 转成java.util.Date
        Date date = Date.from(zonedDateTime.toInstant());
        System.out.println("转换后的Date对象:" + date);
    }
}

这种方式不需要手动清理字符串,直接把(zzz)加入格式模式就能匹配括号里的时区名称,新API的容错性和可读性都更好,也避免了SimpleDateFormat的线程安全问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:28:39