如何使用服务器时间在Firestore中设置纪元

cut*_*iko 9 android firebase google-cloud-firestore

我正试图在Firestore中创建数据时设置纪元.我希望得到一些与实时数据库中所做的相似的结果ServerValue.TIMESTAMP.

我不想通过使用设备时间来设置它,System.getCurrentMillis因为用户可以更改该时间.

根据文档需要进行更新,问题就是格式.这是我的代码:

Map<String, Object> map = new HashMap<>();
map.put("timestamp", FieldValue.serverTimestamp());
reference.update(map);
Run Code Online (Sandbox Code Playgroud)

这是Firebase Web控制台中的结果:

在此输入图像描述

我很惊讶它是西班牙语,这在某些情况下可能有用,但是时代就是我追逐的东西.尝试看到光明的一面并坚持下去,并认为我用西班牙语看到网络,所以我改变了页脚选择器中的语言,它没有改变.在这一点上,我假设是用项目语言设置的.

回到时代的尝试.考虑到我的项目也在使用实时数据库,我尝试以这种方式设置它:

Map<String, Object> map = new HashMap<>();
map.put("timestamp", ServerValue.TIMESTAMP);
reference.update(map);
Run Code Online (Sandbox Code Playgroud)

它确实上传了一些东西,但这只是胡说八道.

在此输入图像描述

我认为使用epoch作为服务器端时间戳是一种更好的标准方法,之后每个客户端都可以将其转换为用户便利性和语言环境.

可以在Firestore中将epoch设置为服务器值吗?

UPDATE

标记为正确的答案引导我得到一些我想分享的有趣发现,因此处于相同情况的其他人可以从中受益:

  • 没有必要设置epoch,因为FieldValue.serverTimestamp()它是由数据库处理的日期对象,我们在控制台中看到的只是一种友好的方式来显示它.
  • 由于FieldValue.serverTimestamp()是日期对象,因此可以按任何其他时间戳排序,如果添加orderBy("timestamp", Query.Direction.DESCENDING)到查询(或Query.Direction.ASCENDING),它将正确排序结果.
  • 关于@ 34m0注释,这是正确的,客户端不应该关注设置创建时间的逻辑,但应该在函数中完成.

Bob*_*der 15

使用FieldValue.serverTimestamp()设置Firestore字段所产生的对象是java.util.Date的一个实例.当您稍后读取该值时,您可以使用getTime()获取纪元时间.

例如,对于像这样创建的文档:

Map<String, Object> doc = new HashMap<>();
doc.put("timestamp", FieldValue.serverTimestamp());
Run Code Online (Sandbox Code Playgroud)

结果值可以这样读取:

docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot snapshot = task.getResult();
            if (snapshot != null) {
                Map<String,Object> map = snapshot.getData();
                Date date = (Date) map.get("timestamp");
                Log.d(TAG, "date=" + date);
                Log.d(TAG, "time=" + date.getTime());
            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get() failed with ", task.getException());
        }
    }
});
Run Code Online (Sandbox Code Playgroud)