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

Java中含GMT的日期转Timestamp失败,如何解决无法解析日期问题?

解决Java中带GMT的日期转Timestamp问题

你的错误源于SimpleDateFormat格式字符串与目标日期字符串不匹配,加上旧API本身的局限性。下面提供两种可行的解决方式:

方式一:修复旧版SimpleDateFormat代码

调整格式字符串,完全匹配目标日期的结构,同时指定英文Locale避免解析失败:

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

public class DataParser {

    public static void main(String[] args) throws ParseException {
        
         String startDate = "Mon May 01 2023 00:00:00 GMT 0300 (GMT 03:00)";
         // 修正格式字符串,匹配"GMT 0300"和"(GMT 03:00)"部分
         SimpleDateFormat inputFormat = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT' Z '('GMT HH:mm')'", Locale.ENGLISH);
         SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

         Date parsedDate = inputFormat.parse(startDate);
         String formattedDate = outputFormat.format(parsedDate);
         Timestamp timestamp = Timestamp.valueOf(formattedDate);
        
         System.out.println(timestamp);
    }
}

关键修正点:

  • 用Z替代原格式中的X:Z匹配RFC 822格式的时区偏移(如0300),而X对应ISO 8601格式的偏移(如+0300),与你的字符串不匹配。
  • 用单引号包裹字面量部分:'GMT'、'('、')'表示这些是固定字符串,不需要解析为日期组件。
  • 指定Locale.ENGLISH:确保英文月份、星期名称能被正确解析,避免系统默认非英文Locale导致的错误。

方式二:使用Java 8+推荐的java.time API(更可靠)

SimpleDateFormat存在线程不安全、API设计冗余等问题,推荐使用Java 8引入的java.time包(JSR-310),代码更清晰且无线程安全问题:

import java.sql.Timestamp;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class DataParser {

    public static void main(String[] args) {
        
         String startDate = "Mon May 01 2023 00:00:00 GMT 0300 (GMT 03:00)";
         DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(
             "EEE MMM dd yyyy HH:mm:ss 'GMT' Z '(GMT HH:mm)'", 
             Locale.ENGLISH
         );

         // 解析为带时区的日期时间
         ZonedDateTime zonedDateTime = ZonedDateTime.parse(startDate, inputFormatter);
         // 两种转Timestamp的方式:
         // 1. 转成LocalDateTime后生成Timestamp
         Timestamp timestamp = Timestamp.valueOf(zonedDateTime.toLocalDateTime());
         // 2. 转成Instant后生成Timestamp(推荐,保留时区信息转换)
         // Timestamp timestamp = Timestamp.from(zonedDateTime.toInstant());
        
         System.out.println(timestamp);
    }
}

优势:

  • 线程安全,可在多线程环境下直接使用。
  • API设计更直观,日期时间组件分离清晰。
  • 支持更丰富的日期格式解析与操作。

内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:43:18