在Java及Android Studio中如何将指定格式字符串转换为Date对象
Java解析"2021-05-19T20:43:29+00:00"格式时间为Date对象的解决方案
失败原因说明
你之前使用的两种格式串均无法匹配的核心原因有两个:
- 待解析的时间字符串不包含毫秒字段,但你写的格式串中加入了
.SSS用于匹配毫秒,导致格式不匹配 - 时区后缀
+00:00是带冒号的偏移量格式,传统Z格式符仅能匹配不带冒号的时区偏移(如+0000),需要用XXX匹配带冒号的偏移量
方案1:Java 8+ 官方推荐方案(优先使用)
Java 8开始引入的java.time包(JSR310)原生支持ISO8601标准格式的时间解析,无需手动编写格式串,且API线程安全,避免了传统SimpleDateFormat的线程安全问题。
如果需要转为传统java.util.Date对象,代码示例如下:
import java.time.OffsetDateTime; import java.util.Date; public class TimeParseTest { public static void main(String[] args) { String timeStr = "2021-05-19T20:43:29+00:00"; // 直接解析标准ISO偏移时间格式 OffsetDateTime offsetDateTime = OffsetDateTime.parse(timeStr); // 转换为java.util.Date对象 Date date = Date.from(offsetDateTime.toInstant()); } }
方案2:兼容低版本JDK的SimpleDateFormat方案
如果需要兼容Java 8以下的版本,可以使用SimpleDateFormat,使用修正后的格式串即可:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class TimeParseTest { public static void main(String[] args) throws ParseException { String timeStr = "2021-05-19T20:43:29+00:00"; // 去掉毫秒匹配字段,使用XXX匹配带冒号的时区偏移 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ROOT); Date date = sdf.parse(timeStr); } }
注意事项
SimpleDateFormat为线程不安全类,多线程环境下不要作为全局静态变量直接复用,每次使用需单独实例化或用ThreadLocal封装- 如果后续待解析的时间字符串增加了毫秒字段(例如
2021-05-19T20:43:29.123+00:00),再将.SSS加回格式串即可
内容的提问来源于stack exchange,提问作者Alex Wesley
相关产品推荐
相关产品推荐

