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

Android 如何使用服务器时间在Firestore中设置历元,android,firebase,google-cloud-firestore,Android,Firebase,Google Cloud Firestore,我试图在Firestore中创建数据时设置纪元。我希望通过使用ServerValue.TIMESTAMP获得与实时数据库中所做的类似的结果 我不想使用设备时间系统设置它。getCurrentMillis,因为用户可以更改该时间 根据需要进行的更新,问题在于格式。这是我的代码: Map<String, Object> map = new HashMap<>(); map.put("timestamp", FieldValue.serverTimestamp()); refe

我试图在Firestore中创建数据时设置纪元。我希望通过使用
ServerValue.TIMESTAMP
获得与实时数据库中所做的类似的结果

我不想使用设备时间
系统设置它。getCurrentMillis
,因为用户可以更改该时间

根据需要进行的更新,问题在于格式。这是我的代码:

Map<String, Object> map = new HashMap<>();
map.put("timestamp", FieldValue.serverTimestamp());
reference.update(map);
Map Map=newhashmap();
put(“timestamp”,FieldValue.serverTimestamp());
参考。更新(地图);
这是Firebase web控制台中的结果:

我很惊讶它是用西班牙语写的,这在某些情况下可能很有用,但我追求的是纪元。试着看到好的一面,坚持下去,并认为我看到的是西班牙语的网页,所以我在页脚选择器中更改了语言,但没有更改。在这一点上,我假设是用项目语言设置的

回到新纪元。考虑到我的项目也使用实时数据库,我尝试以这种方式进行设置:

Map<String, Object> map = new HashMap<>();
map.put("timestamp", ServerValue.TIMESTAMP);
reference.update(map);
Map Map=newhashmap();
map.put(“timestamp”,ServerValue.timestamp);
参考。更新(地图);
它确实上传了一些东西,但这只是胡说八道

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

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

更新

标记为正确的答案让我得出了一些有趣的发现,我想与大家分享,这样其他处于相同情况的人可以从中受益:

  • 由于
    FieldValue.serverTimestamp()
    是由数据库处理的日期对象,因此不需要设置历元,我们在控制台中看到的只是一种友好的显示方式
  • 由于
    FieldValue.serverTimestamp()
    是一个日期对象,因此它可以像任何其他时间戳一样进行排序,如果您将
    orderBy(“timestamp”,Query.Direction.DESCENDING)
    添加到查询中(或
    Query.Direction.singressing
    ),它将正确排序结果
  • 关于@34m0注释,也就是说,客户端不应该考虑设置创建时间的逻辑,而应该在函数中完成

将Firestore字段设置为的结果对象是的实例。当您稍后读取该值时,可以使用获取历元时间

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

Map<String, Object> doc = new HashMap<>();
doc.put("timestamp", FieldValue.serverTimestamp());
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());
        }
    }
});
Map doc=newhashmap();
put(“timestamp”,FieldValue.serverTimestamp());
结果值可以如下读取:

Map<String, Object> doc = new HashMap<>();
doc.put("timestamp", FieldValue.serverTimestamp());
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());
        }
    }
});
docRef.get(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
DocumentSnapshot snapshot=task.getResult();
如果(快照!=null){
Map Map=snapshot.getData();
Date Date=(Date)map.get(“时间戳”);
Log.d(标记“日期=”+日期);
Log.d(标记“time=“+date.getTime());
}否则{
日志d(标签“无此类文件”);
}
}否则{
Log.d(标记“get()失败,错误为”,task.getException());
}
}
});

你可以在客户机上找到道格建议的值,或者你可以考虑使用云函数来做这个。@ 34 M0我在这里,只是让你知道我更新了我的问题谢谢,我正在更新我的答案,添加一些发现。