You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:09:23