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
相关产品推荐
相关产品推荐

