firebase android servervalue.timestamp映射到长



我知道这是旧的,我可以在这里找到一些流行的帖子。但是我发誓我仍然被卡住,我真的不明白每个答案都发布了,已经7个小时了,请友善,给我答案,这杀死了我。

为了使答案清晰直接,我决定从其他帖子中发布一个答案,我认为可能是答案,但我只是不知道如何将其应用于我的代码。

所以,我使用pojo:

HashMap<String, Object> timestamp = new HashMap<>();
public Reservation(String rid,Map timestamp, String status) {
    this.rId = rid;
    this.timestamp = timestamp;
    this.status = status;
}
 public Map getTimestamp() {
   return timestamp;
 }

这就是我写给DB的方式:

 private void SendReservation() {
    final String key = mDatabaseRes.child("Reservations").push().getKey();
    final Reservation reservation = new Reservation(MainActivity.currUser.getUID(),ServerValue.TIMESTAMP,"pending");         
    mDatabaseRes.child("Reservations").child(key).setValue(reservation, new DatabaseReference.CompletionListener() {
        @Override
        public void onComplete(DatabaseError databaseError, DatabaseReference reference) {
            if (databaseError != null) {
                Log.e("Database ERROR", "Failed to write message", databaseError.toException());
            } else {
                Toast.makeText(getApplicationContext(),
                        "success"
                        , Toast.LENGTH_LONG).show();
            }
        }
    });

}

到目前为止,我成功地写信给DB,时间戳还显示时间14090282xxxx(直到现在看来是正确的(,当阅读时间戳值时,错误的错误是"无法在快照上绘制的长期映射"之类的东西,从而获得值:

reservationList.clear();
for (DataSnapshot dsp : dataSnapshot.getChildren()) {
    reservationList.add(dsp.getValue(Reservation.class)); //add result into array list
}

好吧,正如我所说,让我从凯文·奥尼尔(Kevin O'Neill(那里选一个答案,我该如何申请我:这是链接

Param param1;
Param param2;
HashMap<String, Object> timestampCreated;
//required empty constructor
public DataObject(){}
    public DataObject(Param param1, Param param2) {
           this.param1 = param1;
           this.param2 = param2;
           HashMap<String, Object> timestampNow = new HashMap<>();
           timestampNow.put("timestamp", ServerValue.TIMESTAMP);
    }
    public HashMap<String, Object> getTimestampCreated(){
       return timestampCreated;
    }
    @Exclude
    public long getTimestampCreatedLong(){
       return (long)timestampCreated.get("timestamp");
    }

这是通过一些投票所接受的答案,让我感到困惑的是,Timestamnow和Timestampcreated之间有什么联系?,构造函数也没有像我拥有的那样的时间戳。

我需要添加到代码以使其获得正确的结果。

卡住了14小时后,我终于提出了解决方案。

我从这里启发

由于源没有任何解释,因此我会根据我的情况将其重写。

首先,我在班级外删除所有serverValue.timeStamp,也将其从构造函数中删除。

然后我添加此变量成员Long creationDate;

并添加公共getter,以便将时间戳写入DB:

 public java.util.Map<String, String> getCreationDate() {
    return ServerValue.TIMESTAMP;
}

最后要做的是添加方法以检索值长

@Exclude
public Long getCreationDateLong() {
    return creationDate;
}

就是这样,我测试并工作了,希望它也可以帮助某人。

IDEEA是,当您在数据库中设置TIMESTAMP时,将其设置为map,并且在检索它时,将其检索为Long

因此,要获得正确的TIMESTAMP,您需要在正确的位置放置listener,而不是从dataSnapshot中提取TIMESTAMP

Long timeStampLong = (Long) dataSnapshot.child("timestamp").getValue();

您需要使用这样的方法进行转换:

public static String getTimeDate(long timeStamp){
    try{
        DateFormat dateFormat = getDateTimeInstance();
        Date netDate = (new Date(timeStamp));
        return dateFormat.format(netDate);
    } catch(Exception e) {
        return "date";
    }
}

如果您想从对象中获得TIMESTAMP,就比在模型中使用的public setterspublic getters所需的使用:

public void setTimeStamp(Map<String, String> timeStamp) {
    this.timeStamp = timeStamp;
}
public Map<String, String> getTimeStamp() {
    return timeStamp;
}

希望它有帮助。

对于Kotlin用户,这个想法是相同的。设置TIMESTAMP时,将其设置为Map,然后检索它,则将其检索为long

因此,要获得正确的TIMESTAMP,您需要在正确的位置附加listener,而不是从dataSnapshot中提取TIMESTAMP

val timestamp = dataSnapshot.child("timestamp").getValue() as Long

然后,您需要使用一种方法来这样转换:

fun getTimeDate(timeStamp: Long): String? {
    return try {
        val dateFormat: DateFormat = getDateTimeInstance()
        val netDate = Date(timeStamp)
        dateFormat.format(netDate)
    } catch (e: Exception) {
        e.message
    }
}

如果您想从对象中获得TIMESTAMP,而不是在模型中使用的timestamp字段:

val timestamp = emptyMap<String, String>()

到目前为止,如果您问我最简单。

long serverTime = Timestamp.now().getSeconds();

可以在任何地方和任何地方使用。

我在模型类中使用了对象键入日期(时间戳(字段。这已经足够了。

public class Post {
    private String message;
    private Object timeStamp; //<<<<<<<<<<<<<<<<<<<<< Object 
    public Post() {
    }
    public Post(String message, Object timeStamp) {
        this.message = message;
        this.timeStamp = timeStamp;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public Object getTimeStamp() {
        return timeStamp;
    }
    public void setTimeStamp(Object timeStamp) {
        this.timeStamp = timeStamp;
    }
}

写信给Firebase时:

FirebaseDatabase db = FirebaseDatabase.getInstance();
DatabaseReference ref = db.getReference("Posts");
Post newPost = new Post("merhaba", ServerValue.TIMESTAMP);
ref.push().setValue(newPost);

从firebase读取数据时:

FirebaseDatabase db = FirebaseDatabase.getInstance();
DatabaseReference ref = db.getReference("Posts");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        postArrayList.clear();
        for (DataSnapshot data : dataSnapshot.getChildren()){
            Post m = data.getValue(Post.class);
            postArrayList.add(m);
        }
        adapterPost.notifyDataSetChanged();
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
    }
});

阅读时间戳:

Post post = postArrayList.get(position);
String timeStampValue= new SimpleDateFormat("MM/dd/yyyy").format(new Date((long) post.getTimeStamp()));

最新更新