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
标记为正确的答案引导我得到一些我想分享的有趣发现,因此处于相同情况的其他人可以从中受益:
FieldValue.serverTimestamp()它是由数据库处理的日期对象,我们在控制台中看到的只是一种友好的方式来显示它.FieldValue.serverTimestamp()是日期对象,因此可以按任何其他时间戳排序,如果添加orderBy("timestamp", Query.Direction.DESCENDING)到查询(或Query.Direction.ASCENDING),它将正确排序结果.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)