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

Android Firebase项目中DateTime格式转换崩溃问题求助

问题分析

崩溃的核心原因是:从Firebase读取到的writeTime是Unix时间戳字符串(如"1661861458",单位为秒),但你调用DateTime(targetTime)时,该构造函数仅支持解析ISO格式的日期字符串(如"2022-08-30T12:30:58Z"),无法识别纯数字的时间戳格式,因此抛出格式异常。

同时需要排查为什么存储的DateTime().toString()(ISO格式)会变成时间戳:大概率是你的Post实体类中writeTime字段类型定义错误(比如用了Long而非String),导致Firebase自动将ISO字符串转换为时间戳存储;或者读取数据时错误地将字段解析为数字再转为字符串。

解决方案

以下提供两种可靠的解决方式,优先推荐第一种(类型统一,避免格式兼容问题):

方案1:统一用Unix时间戳(毫秒级)存储与处理

步骤1:修改Post实体类

将writeTime定义为long类型,存储当前时间的毫秒级时间戳:

public class Post {
    private String content;
    private long writeTime;

    // Firebase要求的空构造函数
    public Post() {}

    public Post(String content) {
        this.content = content;
        // 存储当前时间的毫秒级时间戳
        this.writeTime = System.currentTimeMillis();
    }

    // Getter & Setter
    public long getWriteTime() { return writeTime; }
    public void setWriteTime(long writeTime) { this.writeTime = writeTime; }
}

步骤2:修改MyAdapter的时间处理函数

直接基于时间戳计算差值,无需依赖DateTime解析:

private String getDiffTimeText(long targetTime) {
    long currentTime = System.currentTimeMillis();
    long diff = currentTime - targetTime;

    // 计算分钟差
    long minutes = diff / (60 * 1000);
    if (minutes < 60) {
        return minutes + "分钟前";
    }

    // 计算小时差
    long hours = minutes / 60;
    if (hours < 24) {
        return hours + "小时前";
    }

    // 计算天数差
    long days = hours / 24;
    return days + "天前";

    // 如需支持更长时间(如周/月),可继续扩展逻辑
}

方案2:兼容时间戳字符串的DateTime解析

如果必须保留字符串存储格式,修改getDiffTimeText(),先尝试将字符串转为时间戳再构建DateTime对象:

private String getDiffTimeText(String targetTimeStr) {
    DateTime targetTime;
    try {
        // 先尝试解析为秒级时间戳,转成毫秒后构建DateTime
        long timestamp = Long.parseLong(targetTimeStr);
        targetTime = new DateTime(timestamp * 1000);
    } catch (NumberFormatException e) {
        // 解析失败则尝试ISO格式(兼容原有存储的正确格式)
        targetTime = new DateTime(targetTimeStr);
    }

    DateTime currentTime = new DateTime();
    Minutes minutes = Minutes.minutesBetween(targetTime, currentTime);
    if (minutes.getMinutes() < 60) {
        return minutes.getMinutes() + "分钟前";
    }

    Hours hours = Hours.hoursBetween(targetTime, currentTime);
    if (hours.getHours() < 24) {
        return hours.getHours() + "小时前";
    }

    Days days = Days.daysBetween(targetTime, currentTime);
    return days.getDays() + "天前";
}
额外检查
  1. 登录Firebase控制台,确认writeTime字段的实际存储类型:如果是数字类型,必须用getLong()读取;如果是字符串,确保内容符合预期格式。
  2. 读取数据时,避免错误的类型转换:比如不要将Long类型的时间戳转为String后再传给DateTime构造函数。

内容的提问来源于stack exchange,提问作者josephyumss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:24:45