如何将带偏移量的日期时间字符串解析为LocalDateTime并确定其格式?
解决日期字符串解析问题:自定义DateTimeFormatter匹配格式
首先,你遇到的问题是因为ISO_OFFSET_DATE_TIME的格式和你的目标字符串完全不匹配——这个预定义格式对应的是类似2021-10-09T02:10:23-04:00的结构,而你的字符串是带星期缩写、月份缩写的RFC风格日期,所以必须自定义格式器才能正确解析。
步骤1:拆解日期字符串的结构
我们把你的字符串Sat, 09 Oct 2021 02:10:23 -0400拆分成各个组件,对应Java DateTimeFormatter的模式符:
Sat:英文星期缩写 → 模式符EEE,:字面逗号 → 直接写,09:两位日期 → 模式符ddOct:英文月份缩写 → 模式符MMM2021:四位年份 → 模式符yyyy02:10:23:24小时制时分秒 → 模式符HH:mm:ss-0400:四位数字的时区偏移(±HHMM) → 模式符XX
步骤2:编写自定义格式器并解析
需要注意的是,因为月份和星期是英文缩写,必须指定Locale.ENGLISH,否则默认Locale如果不是英文会解析失败。另外,你的字符串包含时区偏移信息,先解析为ZonedDateTime保留完整时区语义,再转LocalDateTime会更严谨:
import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.Locale; public class DateParseExample { public static void main(String[] args) { String s = "Sat, 09 Oct 2021 02:10:23 -0400"; // 自定义匹配格式,指定英文Locale DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss XX", Locale.ENGLISH); ZonedDateTime zonedDateTime = ZonedDateTime.parse(s, formatter); LocalDateTime dateTime = zonedDateTime.toLocalDateTime(); System.out.println(dateTime); // 输出:2021-10-09T02:10:23 } }
快速确定格式的小技巧
记住几个常用模式符的对应关系,把它们按字符串顺序拼接,再加上必要的字面符号(逗号、空格等)即可:
- 星期:
E(短缩写,如Sat)、EEEE(全称,如Saturday) - 日期:
d(1-2位)、dd(两位补零) - 月份:
M(数字1-12)、MM(两位数字)、MMM(缩写)、MMMM(全称) - 年份:
yyyy(四位)、yy(两位) - 时区:
XX(±HHMM,如-0400)、XXX(±HH:MM,如-04:00)、ZZZZ(GMT±HHMM,如GMT-0400)
内容的提问来源于stack exchange,提问作者Paras
相关产品推荐
相关产品推荐

