Java中解析带单小时位偏移的字符串日期时间
嘿,这个问题我之前也碰到过!你遇到的报错根源是偏移格式的匹配问题:
- 你一开始用的
Z模式对应不带冒号的RFC 822偏移格式(比如+0300),完全不匹配+3:00; - 后来用的
XXX模式虽然支持带冒号的偏移,但它默认要求小时是两位(比如+03:00),所以遇到+3:00这种一位小时的格式就会在索引26处报错。
给你两种简单靠谱的解决方法:
方法一:用支持灵活偏移的X模式(推荐)
X是ISO-8601风格的偏移模式,它能自动适配多种偏移格式——不管是+3、+300、+3:00还是+03:00都能完美匹配。你只需要把格式字符串改成下面这样就行:
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class DateParseDemo { public static void main(String[] args) { String dateStr = "2018-05-15 09:32:51.550082 +3:00"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS X"); ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateStr, formatter); System.out.println("解析结果:" + zonedDateTime); } }
方法二:自定义偏移格式(更灵活可控)
如果需要更精确地控制偏移的匹配规则,可以用DateTimeFormatterBuilder来构建格式,明确允许小时是一位或两位:
import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; public class DateParseDemo { public static void main(String[] args) { String dateStr = "2018-05-15 09:32:51.550082 +3:00"; DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd HH:mm:ss.SSSSSS ") .appendOffset("+H:mm", "+HH:mm", "Z") // 同时支持一位/两位小时的偏移 .toFormatter(); ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateStr, formatter); System.out.println("解析结果:" + zonedDateTime); } }
两种方法都能成功解析你的日期字符串,第一种更简洁,日常用完全足够~
内容的提问来源于stack exchange,提问作者tomasomsk
相关产品推荐
相关产品推荐

