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

Android Kotlin如何向Firebase实时数据库添加当前日期并实现数据存取

1. 选择存储的日期数据类型

优先选毫秒级时间戳(Long类型),优势如下:

  • Firebase Realtime Database对数值类型适配性好,没有序列化/反序列化异常问题
  • 后续按时间排序、筛选特定时间区间的数据操作非常方便,灵活性远高于字符串格式
  • 不受时区影响,后续可以按需转成任意时区的可读日期格式

2. 更新Notifications数据类

给类新增createTime字段,类型为Long,如果需要兼容历史数据可以给字段加默认值,避免读取旧数据时崩溃:

data class Notifications(
    val emailA: String, 
    val title: String, 
    val body: String,
    val createTime: Long = 0 // 新增时间戳字段,默认值适配旧数据
)

3. 修改写入代码,传入当前时间戳

构造Notifications实例时,直接用System.currentTimeMillis()获取当前设备时间的毫秒戳传入即可:

val notificstionRef = rootRef.child("Notifications")
val eventListener1: ValueEventListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        val recharge = amountText.getText().toString()
        val title = "Recharge Amount"
        // 构造实例时新增当前时间戳参数
        val notifications = Notifications(sessionId,title,recharge, System.currentTimeMillis())
        ref1.child(sessionId).setValue(notifications).addOnSuccessListener {
        } .addOnFailureListener{
        }
    }
    override fun onCancelled(databaseError: DatabaseError) {
    }
}
notificstionRef.addListenerForSingleValueEvent(eventListener1)

可选优化:如果担心用户设备本地时间不准,可以使用Firebase服务器时间,只需要把写入时传的System.currentTimeMillis()换成ServerValue.TIMESTAMP,对应数据类的createTime字段类型改为Any即可,读取到的还是Long类型的时间戳,使用方式不变。

4. 修改读取代码,获取并使用日期字段

读取时可以直接拿到Long类型的时间戳,需要显示为人类可读格式的话,加个简单的转换方法即可:

val rootRef = FirebaseDatabase.getInstance().reference
val userRef = rootRef.child("Notifications").child(sessionId)
val valueEventListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        val title = dataSnapshot.child("title").getValue(String::class.java)
        val body = dataSnapshot.child("body").getValue(String::class.java)
        // 读取时间戳字段
        val createTime = dataSnapshot.child("createTime").getValue(Long::class.java)
        // 转成yyyy-MM-dd HH:mm:ss格式的可读字符串,格式可以按需调整
        val timeStr = createTime?.let {
            SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(Date(it))
        } ?: "无时间记录"
        
        title1Notification.setText(title)
        body1Notification.setText(body)
        // 如需展示时间,赋值到对应控件即可
        // timeView.setText(timeStr)
    }

    override fun onCancelled(error: DatabaseError) {
        Log.d("TAG", error.getMessage())
    }
}
userRef.addListenerForSingleValueEvent(valueEventListener)

使用SimpleDateFormat需要提前导入三个包:java.util.Date、java.text.SimpleDateFormat、java.util.Locale。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:36:03