Android 如何使用服务器时间在Firestore中设置历元
我试图在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
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注释,也就是说,客户端不应该考虑设置创建时间的逻辑,而应该在函数中完成
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我在这里,只是让你知道我更新了我的问题谢谢,我正在更新我的答案,添加一些发现。