如何从Firebase子节点中检索时间戳,Android版。

huangapple go评论107阅读模式
英文:

How to retrieve time stamp from Firebase child Android

问题

以下是翻译好的内容:

我正在创建一个社交应用,当有人上传帖子时,上传帖子的时间也被记录下来。

我想要获取帖子上传的日期和时间,并以适当的形式展示给用户。例如,如果是在2小时前上传的,它将显示为"2小时前",而不是完整的上传日期和时间,或上传日期的时间戳。那么,我应该如何展示它,哪种方式最简单?

这段代码:

  1. Post post = dataSnapshot.getValue(Post.class);
  2. dateAdded.setText(post.getDate_time());

我得到了这个错误:

java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法'java.lang.String com.example.gone.Model.Post.getDate_time()'

所以,如果有人知道如何实现这个,请帮助我一下,谢谢。

编辑---

我想要显示日期/时间的方法 -

  1. private void getDate(TextView dateAdded) {
  2. DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Posts").child("date_time");
  3. reference.addValueEventListener(new ValueEventListener() {
  4. @Override
  5. public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  6. Post post = dataSnapshot.getValue(Post.class);
  7. dateAdded.setText(post.getDate_time());
  8. }
  9. @Override
  10. public void onCancelled(@NonNull DatabaseError error) {
  11. }
  12. });
  13. }

Post类:

  1. private String date_time;
  2. public String getDate_time() {
  3. return date_time;
  4. }
  5. public void setDate_time(String date_time) {
  6. this.date_time = date_time;
  7. }
  8. public Post(String date_time) {
  9. this.date_time = date_time;
  10. }

JSON节点:

  1. "Posts" : {
  2. "-MJ-VvX8zPdt2DY0pVqb" : {
  3. "date_time" : "01-10-2020 22:17:43",
  4. "description" : "",
  5. "postid" : "-MJ-VvX8zPdt2DY0pVqb",
  6. "postimage" : "https://firebasestorage.googleapis.com/v0/b/gone-b14f5.appspot.com/o/posts%2F1602031430356.null?alt=media&token=dc7c4a5c-d652-44be-bb2a-28283964da1e",
  7. "publisher" : "gIt685Xex8eZaPBSsbcPbU1S5V93"
  8. },
  9. // 其他帖子的信息...
  10. }
英文:

I am creating a social app and when someone uploads a post the time they uploaded the post is also uploaded.

I want to get the date and time it was uploaded and show it to the user in a proper form. For example if it was uploaded 2 hours ago it will say 2hr instead of the entire date and time it was uploaded or the time stamp of the uploaded date. So how do I show it and which was is easiest ?

如何从Firebase子节点中检索时间戳,Android版。

This code:

  1. Post post = dataSnapshot.getValue(Post.class);
  2. dateAdded.setText(post.getDate_time());

I get this error:

> java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.gone.Model.Post.getDate_time()' on a null object reference

So if someone has a way of doing this can someone please help me ? Thanks

EDIT ---

The method where I want to show the date/time -

  1. private void getDate(TextView dateAdded) {
  2. DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Posts").child("date_time");
  3. reference.addValueEventListener(new ValueEventListener() {
  4. @Override
  5. public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  6. //dateAdded.setText((CharSequence) dataSnapshot.child("date_time"));
  7. Post post = dataSnapshot.getValue(Post.class);
  8. dateAdded.setText(post.getDate_time());
  9. }
  10. @Override
  11. public void onCancelled(@NonNull DatabaseError error) {
  12. }
  13. });
  14. }

Post.class:

  1. private String date_time;
  2. public String getDate_time() {
  3. return date_time;
  4. }
  5. public void setDate_time(String date_time) {
  6. this.date_time = date_time;
  7. }
  8. public Post(String date_time) {
  9. this.date_time = date_time;
  10. }

JSON node:

  1. "Posts" : {
  2. "-MJ-VvX8zPdt2DY0pVqb" : {
  3. "date_time" : "01-10-2020 22:17:43",
  4. "description" : "",
  5. "postid" : "-MJ-VvX8zPdt2DY0pVqb",
  6. "postimage" : "https://firebasestorage.googleapis.com/v0/b/gone-b14f5.appspot.com/o/posts%2F1602031430356.null?alt=media&token=dc7c4a5c-d652-44be-bb2a-28283964da1e",
  7. "publisher" : "gIt685Xex8eZaPBSsbcPbU1S5V93"
  8. },
  9. "-MJ-qP4mKkkXCTGQeqhq" : {
  10. "date_time" : "06-10-2020 22:17:43",
  11. "description" : "",
  12. "postid" : "-MJ-qP4mKkkXCTGQeqhq",
  13. "postimage" : "https://firebasestorage.googleapis.com/v0/b/gone-b14f5.appspot.com/o/posts%2F1602037062255.null?alt=media&token=5fde471b-f794-4376-8250-18c0893c716e",
  14. "publisher" : "gIt685Xex8eZaPBSsbcPbU1S5V93"
  15. },
  16. "-MJUqKzwnZfC0cVRRohI" : {
  17. "dateAdded" : "12-10-2020 22:45:41",
  18. "date_time" : "1602557141467",
  19. "description" : "",
  20. "postid" : "-MJUqKzwnZfC0cVRRohI",
  21. "postimage" : "https://firebasestorage.googleapis.com/v0/b/gone-b14f5.appspot.com/o/posts%2F1602557139321.null?alt=media&token=06af1115-481a-4c0f-8ba7-3bef13da3989",
  22. "publisher" : "J51XZDETvNT86eCLtqU5XHUzEWu2"
  23. }
  24. }

答案1

得分: 1

date_time不是Posts的直接子项。请将date_time替换为-MJ-VvX8zPdt2DY0pVqb

尝试如下:

  1. DatabaseReference reference = FirebaseDatabase
  2. .getInstance()
  3. .getReference()
  4. .child("Posts")
  5. .child("-MJ-VvX8zPdt2DY0pVqb");

更新

要显示所有帖子,您需要使用RecyclerView。

这里是从Firebase Quickstart 中复制的代码。

  1. Query postsQuery = FirebaseDatabase
  2. .getInstance().getReference().child("Posts").limitToFirst(100);
  3. FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<Post>()
  4. .setQuery(postsQuery, Post.class)
  5. .build();
  6. mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(options) {
  7. @Override
  8. public PostViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
  9. LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
  10. return new PostViewHolder(inflater.inflate(R.layout.item_post, viewGroup, false));
  11. }
  12. @Override
  13. protected void onBindViewHolder(PostViewHolder viewHolder, int position, final Post model) {
  14. // model.date
  15. }
  16. };
  17. mRecycler.setAdapter(mAdapter);

更新 2

要显示时间:

  1. // 如果date_time是Long类型,例如:1602557141467
  2. val time = 1602557141467
  3. // 如果date_time是String类型,例如:01-10-2020 22:17:43
  4. val time = SimpleDateFormat(
  5. "dd-MM-yyyy HH:mm:ss",
  6. Locale.getDefault()
  7. ).parse("01-10-2020 22:17:43")?.time ?: 0
  8. val deltaTime = Date().time - time
  9. val minutes = (deltaTime / (60 * 1000)).toInt() % 60
  10. val hours = (deltaTime / (60 * 60 * 1000)).toInt() % 24
  11. val days = (deltaTime / (24 * 60 * 60 * 1000)).toInt()
  12. val result = buildString {
  13. if (days != 0) append("${days}d ")
  14. if (hours != 0) append("${hours}h ")
  15. if (minutes != 0) append("${minutes}m")
  16. }
英文:

date_time is not direct child of Posts. Instead of date_time paste -MJ-VvX8zPdt2DY0pVqb.

Try like that:

  1. DatabaseReference reference = FirebaseDatabase
  2. .getInstance()
  3. .getReference()
  4. .child(&quot;Posts&quot;)
  5. .child(&quot;-MJ-VvX8zPdt2DY0pVqb&quot;);

Update:

To show all posts you need RecyclerView.

Here code that copied from Firebase Quickstart.

  1. Query postsQuery = FirebaseDatabase
  2. .getInstance().getReference().child(&quot;Posts&quot;).limitToFirst(100);
  3. FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder&lt;Post&gt;()
  4. .setQuery(postsQuery, Post.class)
  5. .build();
  6. mAdapter = new FirebaseRecyclerAdapter&lt;Post, PostViewHolder&gt;(options) {
  7. @Override
  8. public PostViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
  9. LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
  10. return new PostViewHolder(inflater.inflate(R.layout.item_post, viewGroup, false));
  11. }
  12. @Override
  13. protected void onBindViewHolder(PostViewHolder viewHolder, int position, final Post model) {
  14. // model.date
  15. });
  16. }
  17. };
  18. mRecycler.setAdapter(mAdapter);

Update 2:

To show time:

  1. // if date_time is Long like: 1602557141467
  2. val time = 1602557141467
  3. // if date_time is String like: 01-10-2020 22:17:43
  4. val time = SimpleDateFormat(
  5. &quot;dd-MM-yyyy HH:mm:ss&quot;,
  6. Locale.getDefault()
  7. ).parse(&quot;01-10-2020 22:17:43&quot;)?.time ?: 0
  8. val deltaTime = Date().time - time
  9. val minutes = (deltaTime / (60 * 1000)).toInt() % 60
  10. val hours = (deltaTime / ( 60 * 60 * 1000)).toInt() % 24
  11. val days = (deltaTime / ( 24 * 60 * 60 * 1000)).toInt()
  12. val result = buildString {
  13. if (days != 0) append(&quot;${days}d &quot;)
  14. if (hours != 0) append(&quot;${hours}h &quot;)
  15. if (minutes != 0) append(&quot;${minutes}m&quot;)
  16. }

答案2

得分: 0

我使用Gson来转换我的数据,在build.gradle中:

  1. dependencies {
  2. implementation 'com.google.code.gson:gson:2.8.6'
  3. }

在我的代码中:

  1. Gson gson = new Gson();
  2. JsonElement jsonElement = gson.toJsonTree(dataSnapshot.getValue());
  3. Post post = gson.fromJson(jsonElement, Post.class);
  4. dateAdded.setText(post.getDate_time());

请记得让你的Post类实现Serializable接口,以在运行时获得更好的结果:

  1. import java.io.Serializable;
  2. public class Post implements Serializable{}

因为某种原因,直接在Firebase中进行操作会失败。

英文:

I use Gson for convert my data, in build.gradle:

  1. dependencies {
  2. implementation &#39;com.google.code.gson:gson:2.8.6&#39;
  3. }

In my code:

  1. Gson gson = new Gson();
  2. JsonElement jsonElement = gson.toJsonTree(dataSnapshot.getValue());
  3. Post post = gson.fromJson(jsonElement, Post.class);
  4. dateAdded.setText(post.getDate_time());

Remember make your Post class Serializable to have better results in runtime

  1. import java.io.Serializable;
  2. public class Post implements Serializable{}

For some reason doing it direct with Firebase fails

huangapple
  • 本文由 发表于 2020年10月14日 00:13:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/64339099.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定