Kotlin对接Firebase时如何将帖子时间戳转换为日期格式显示
Firebase时间戳转展示日期实现
原代码存在的两个问题
- 数据库节点路径写错:你初始化引用时已经定位到
PrayerInfo/time节点,循环遍历子节点时又重复嵌套取PrayerInfo/time字段,根本拿不到正确的时间戳值 - 无格式转换逻辑:拿到Long类型时间戳后直接调用
toString(),只能显示原始的数字时间戳,不会自动转成日期格式
可直接运行的修正代码
以下代码实现和你截图一致的「相对时间」效果(比如x分钟前、x天前、x周前),用Android原生API实现,不需要额外引入依赖:
fun getTimeDate() { // 修正引用路径:定位到存储所有帖子的PrayerInfo根节点 val prayerreference = FirebaseDatabase.getInstance().getReference("PrayerInfo") prayerreference.addValueEventListener(object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { for (ds in dataSnapshot.children) { // 从单条帖子节点取time字段,加空安全判断避免崩溃 val timestamp = ds.child("time").getValue(Long::class.java) ?: continue // 转换为相对时间格式,和截图效果一致 val displayTime = DateUtils.getRelativeTimeSpanString( timestamp, System.currentTimeMillis(), DateUtils.MINUTE_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE ).toString() timepost.text = displayTime } } override fun onCancelled(databaseError: DatabaseError) { Log.d(ContentValues.TAG, databaseError.message) } }) }
固定日期格式转换方法
如果你不需要相对时间,要展示固定格式的日期(比如2024-05-20 14:30),把上面转换相对时间的代码替换成下面的即可:
// 自定义你需要的日期格式 val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()) // 如果Firebase存的是秒级时间戳,这里要改成 Date(timestamp * 1000) val fixedDateStr = dateFormat.format(Date(timestamp)) timepost.text = fixedDateStr
避坑提示
- 先确认Firebase存储的时间戳是毫秒级还是秒级:Firebase默认生成的
ServerValue.TIMESTAMP是毫秒级,如果是自己存的秒级时间戳,转换时必须乘以1000,否则日期会显示几十年前的错误值 - 如果你用RecyclerView展示多条帖子,不要在ValueEventListener里直接给全局的
timepost控件赋值,应该把时间戳传到列表适配器,在onBindViewHolder里给每个item单独的时间控件做转换,否则所有条目都会显示最后一条帖子的时间 - 如果取值时拿不到timestamp,在循环里打日志输出
ds.value看当前节点的实际结构,调整取time字段的路径即可
内容的提问来源于stack exchange,提问作者EvanrobbyMacharia
相关产品推荐
相关产品推荐

