Android中使用PrettyTime解析RSS的updated格式日期崩溃求助
解决PrettyTime解析ISO 8601格式日期崩溃的问题
你遇到的崩溃核心原因很明确:new Date(String)这个构造方法早已被废弃,而且它完全无法识别ISO 8601格式的日期字符串——也就是<updated>标签里的2017-12-30T11:10:44+00:00这种带T和时区冒号的格式。直接把这类字符串传给Date构造器会抛出ParseException,进而导致应用崩溃。
下面是几种实用的解决思路:
1. 用SimpleDateFormat手动适配解析
SimpleDateFormat支持自定义格式模板,但要注意它默认的时区格式符Z不兼容带冒号的+00:00,所以需要先做字符串替换处理:
// 把格式化对象定义为全局变量,避免每次绑定都重复创建 private final PrettyTime p = new PrettyTime(Locale.ENGLISH); private final SimpleDateFormat isoDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.ENGLISH); @Override public void onBindViewHolder(final RecyclerViewAdapter.ViewHolder holder, int position) { setupImageLoader(); final News newsItem = newsItems.get(position); String imgUrl = newsItem.getNewsImage(); // 处理日期解析逻辑 try { String updatedStr = newsItem.getUpdated(); // 替换时区里的冒号,适配SimpleDateFormat的格式要求 String normalizedDate = updatedStr.replace("+00:00", "+0000"); Date updatedDate = isoDateFormat.parse(normalizedDate); holder.date_updated.setText(p.format(updatedDate)); } catch (ParseException e) { // 解析失败时的降级处理,比如显示原始日期或默认文本 holder.date_updated.setText(newsItem.getUpdated()); e.printStackTrace(); } holder.title.setText(newsItem.getTitle()); }
2. 使用Java 8+日期API(更健壮推荐)
如果你的项目支持Java 8+日期API(比如通过Gradle开启Core Library Desugaring,或者目标API≥26),可以直接用预定义的ISO_OFFSET_DATE_TIME格式解析,无需手动处理时区:
private final PrettyTime p = new PrettyTime(Locale.ENGLISH); private final DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME; @Override public void onBindViewHolder(final RecyclerViewAdapter.ViewHolder holder, int position) { setupImageLoader(); final News newsItem = newsItems.get(position); String imgUrl = newsItem.getNewsImage(); try { OffsetDateTime offsetDateTime = OffsetDateTime.parse(newsItem.getUpdated(), isoFormatter); Date updatedDate = Date.from(offsetDateTime.toInstant()); holder.date_updated.setText(p.format(updatedDate)); } catch (DateTimeParseException e) { holder.date_updated.setText(newsItem.getUpdated()); e.printStackTrace(); } holder.title.setText(newsItem.getTitle()); }
额外注意点
- 一定要加异常捕获:日期解析可能因为格式不匹配、空字符串等情况失败,捕获异常能避免崩溃,同时给用户显示友好的替代内容。
- 复用格式化对象:不要在
onBindViewHolder里每次都创建格式化实例,全局复用能提升RecyclerView的绑定性能。
内容的提问来源于stack exchange,提问作者PLab
相关产品推荐
相关产品推荐

