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() + "天前"; }
额外检查
- 登录Firebase控制台,确认
writeTime字段的实际存储类型:如果是数字类型,必须用getLong()读取;如果是字符串,确保内容符合预期格式。 - 读取数据时,避免错误的类型转换:比如不要将
Long类型的时间戳转为String后再传给DateTime构造函数。
内容的提问来源于stack exchange,提问作者josephyumss
相关产品推荐
相关产品推荐

