Android环境下如何解析2018-05-19T04:51:29.6702751+00:00为Date object
在Android中将带时区的ISO日期字符串转为Date对象
这个问题我之前做项目时刚好遇到过,其实处理这种格式的日期字符串并不复杂,根据你的Android版本可以选择不同的方案:
方案一:Android 8.0(API 26)及以上推荐使用java.time API
从Android 8.0开始,系统支持Java 8引入的java.time包,这是官方推荐的日期处理方式,相比旧的SimpleDateFormat更安全(无线程安全问题),也更易用:
String serverDateStr = "2018-05-19T04:51:29.6702751+00:00"; // 直接用内置的ISO偏移日期时间格式化器,完美匹配你的字符串格式 DateTimeFormatter formatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; OffsetDateTime offsetDateTime = OffsetDateTime.parse(serverDateStr, formatter); // 如果需要转换为Date对象(如果业务需要的话,更推荐直接使用OffsetDateTime等新类型) Date date = Date.from(offsetDateTime.toInstant());
ISO_OFFSET_DATE_TIME格式化器原生就支持解析带时区偏移(比如+00:00)的ISO日期字符串,不需要额外自定义格式,非常省心。
方案二:兼容Android 7.0及以下版本(使用SimpleDateFormat)
如果需要适配更低版本的Android,可以用传统的SimpleDateFormat,只需要正确定义格式字符串即可:
String serverDateStr = "2018-05-19T04:51:29.6702751+00:00"; // 格式字符串对应解析规则:SSSSSSS匹配毫秒后的纳秒部分,XXX匹配时区偏移(如+00:00) SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSXXX", Locale.US); try { Date date = sdf.parse(serverDateStr); // 这里处理转换后的Date对象 } catch (ParseException e) { // 处理解析异常 e.printStackTrace(); }
注意两点:
- 必须指定
Locale.US,避免因系统区域设置差异导致解析失败 XXX是用来匹配+00:00这种格式的时区偏移,不能用Z(Z对应+0000不带冒号的格式)
额外推荐:低版本Android的更佳选择(ThreeTenABP)
如果你不想用SimpleDateFormat(毕竟它有线程安全隐患),可以引入ThreeTenABP库,它是java.time API在低版本Android上的兼容实现,用法和方案一几乎一致,只需要更换包路径即可。
内容的提问来源于stack exchange,提问作者Kishita Variya
相关产品推荐
相关产品推荐

