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

Android Studio中如何从Firebase获取日期并显示到TextView?

获取并格式化Firebase中的日期时间戳

没问题!你已经成功把日期以**时间戳(long类型)**的形式存入Firebase了,现在只需要在获取用户数据的逻辑里加几步,就能把这个时间戳转成你想要的dd:MM:yyyy格式并显示出来。

第一步:从Firebase读取时间戳

在你现有的ValueEventListener的onDataChange方法里,添加读取transdate字段的代码就行。这里要注意处理字段不存在或者为null的情况,免得触发空指针异常:

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    // 读取你原本的用户数据
    String u_name = dataSnapshot.child("name").getValue(String.class);
    String u_email = dataSnapshot.child("email").getValue(String.class);
    Integer post_balance = dataSnapshot.child("balance").getValue(Integer.class);
    
    // 新增:读取存储的时间戳
    Long transTimestamp = dataSnapshot.child("transdate").getValue(Long.class);
    
    // 更新UI(记得给可能为空的字段加默认值)
    tvname.setText(u_name != null ? u_name : "");
    tvemail.setText(u_email != null ? u_email : "");
    tvbalance.setText(post_balance != null ? String.valueOf(post_balance) : "0");
    
    // 接下来处理日期格式化(看第二步)
    if (transTimestamp != null) {
        String formattedDate = formatTimestampToDate(transTimestamp);
        // 把这个字符串设置到你的日期显示控件上,比如假设你有个tvTransDate
        // tvTransDate.setText(formattedDate);
    }
}

第二步:写个工具方法格式化时间戳

接下来需要把long类型的时间戳转成dd:MM:yyyy格式的字符串,这里分两种常用方案:

方案1:用Java 7及更早的SimpleDateFormat

如果你项目还在用旧版Java,用这个就行:

private String formatTimestampToDate(long timestamp) {
    // 定义你要的日期格式
    SimpleDateFormat sdf = new SimpleDateFormat("dd:MM:yyyy", Locale.getDefault());
    // 把时间戳转成Date对象
    Date date = new Date(timestamp);
    // 格式化返回字符串
    return sdf.format(date);
}

小提醒:SimpleDateFormat不是线程安全的,如果在多线程场景下用,最好每次调用都新建实例,或者用线程安全的替代类。

方案2:用Java 8+的java.time API(推荐)

如果你的项目用Java 8或更高版本,强烈推荐用这套更安全、更清晰的新API:

private String formatTimestampToDate(long timestamp) {
    // 把时间戳转成LocalDate(这里用系统默认时区,需要特定时区的话可以改ZoneId)
    LocalDate localDate = Instant.ofEpochMilli(timestamp)
            .atZone(ZoneId.systemDefault())
            .toLocalDate();
    // 定义日期格式
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd:MM:yyyy");
    // 格式化返回
    return localDate.format(formatter);
}

整合后的完整代码

把上面的代码整合到你的原有逻辑里,最终的代码是这样的:

String currentUid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference uDatabaseReference = FirebaseDatabase.getInstance().getReference().child("Users");
uDatabaseReference.child(currentUid).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String u_name = dataSnapshot.child("name").getValue(String.class);
        String u_email = dataSnapshot.child("email").getValue(String.class);
        Integer post_balance = dataSnapshot.child("balance").getValue(Integer.class);
        Long transTimestamp = dataSnapshot.child("transdate").getValue(Long.class);

        // 更新UI,处理空值
        tvname.setText(u_name != null ? u_name : "");
        tvemail.setText(u_email != null ? u_email : "");
        tvbalance.setText(post_balance != null ? String.valueOf(post_balance) : "0");

        // 格式化并显示日期
        if (transTimestamp != null) {
            String formattedDate = formatTimestampToDate(transTimestamp);
            // 替换成你的日期显示控件ID
            // tvTransDate.setText(formattedDate);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});

// Java 8+ 版本的格式化方法(推荐)
private String formatTimestampToDate(long timestamp) {
    LocalDate localDate = Instant.ofEpochMilli(timestamp)
            .atZone(ZoneId.systemDefault())
            .toLocalDate();
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd:MM:yyyy");
    return localDate.format(formatter);
}

// 如果你用Java 7及以下,就用这个方法替代上面的
/*
private String formatTimestampToDate(long timestamp) {
    SimpleDateFormat sdf = new SimpleDateFormat("dd:MM:yyyy", Locale.getDefault());
    Date date = new Date(timestamp);
    return sdf.format(date);
}
*/

几个要注意的点

  • 一定要处理getValue返回null的情况,比如用户数据里还没存transdate的时候,不然容易崩。
  • 如果你的应用需要适配不同时区,可以把ZoneId.systemDefault()改成具体的时区,比如ZoneId.of("Asia/Shanghai"),这样日期显示就不会随系统时区变化了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 03:32:39