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
相关产品推荐
相关产品推荐

