如何以毫秒为单位获取firebase服务器的当前时间戳?
Posted
技术标签:
【中文标题】如何以毫秒为单位获取firebase服务器的当前时间戳?【英文标题】:How to get current timestamp of firebase server in milliseconds? 【发布时间】:2016-11-30 07:12:37 【问题描述】:我想获取 firebase 当前时间戳,但无法找到获取该时间戳的方法。如图所示,我想保存孩子。为此,我必须获取时间戳并相应地获取日期。请帮忙...
【问题讨论】:
您的意思是要将服务器时间设置为具有该格式(dd-mm-yyyy)的键吗? @wilik。是的,正是 请注意,Firestore 中时间戳的 Firebase 行为在最新版本的 Firestore 5.4.1 中发生了变化。 【参考方案1】:您可以使用ServerValue.TIMESTAMP
设置服务器时间,这是Map<String, String>
类型和".sv" : "timestamp"
对。当它被发送到 firebase 数据库时,它将被转换为 Long Unix epoch time,就像这样 1469554720
。
所以问题是,您不能直接将其设置为键。最好的方法是将时间戳放在您的对象中,并使用DatabaseReference.push()
来获取保证的唯一键。
例如
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
String key = ref.push().getKey(); // this will create a new unique key
Map<String, Object> value = new HashMap<>();
value.put("name", "shesh");
value.put("address", "lucknow");
value.put("timestamp", ServerValue.TIMESTAMP);
ref.child(key).setValue(value);
如果您想以该格式 (dd-mm-yyyy) 保存它,有一个 hack,但不建议这样做。您需要先将其 (ServerValue.TIMESTAMP) 保存到另一个临时节点,然后在使用 Date
类将其转换为该格式之前检索时间戳。
【讨论】:
非常感谢..我试过了,它工作正常。我也可以这样做。但是同样可以使用这个 ServerValue.TIMESTAMP 作为键吗? 不客气。我认为有可能但是会有两个API调用,首先设置TIMESTAMP值然后使用Query.limitToLast(1);
获取最后一个密钥,不推荐这样做,因为有可能两个用户同时插入两个TIMESTAMP所以你无法获得正确的密钥。顺便说一句,如果您这么认为,请将我的回答标记为已接受。 :)【参考方案2】:
其实你可以使用云函数,通过 HTTP 请求获取时间戳。 功能很简单。
exports.getTimeStamp = functions.https.onRequest((req, res)=>
res.setHeader('Content-Type', 'application/json');
res.send(JSON.stringify( timestamp: Date.now() ));
);
【讨论】:
从技术上讲,这将获取节点 js 服务器的时间戳,理论上可能与 Firebase 或 Firestore 数据库所在的服务器不同。 @Jonathan 感谢您提出这个问题,这是一个 unix 时间戳,它是特定日期和 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)之间的秒数。因此,从技术上讲,无论您身在何处,它都不会改变,这就是它在当今计算机系统中广泛使用的原因。 Google 服务器会正确设置,但无论时间戳是否正确,其他服务器的时间都可能错误。【参考方案3】:在 android 上我是这样做的
index.js / 服务器端
const functions = require('firebase-functions');
exports.stamp = functions.https.onCall(() =>
var d = new Date();
console.log('TimeStamp_now : '+d.getTime());
return timeStamp: d.getTime() ;
);
someclass.kt / 客户端
lateinit var functions: FirebaseFunctions
var ret :Long = 0
FirebaseApp.initializeApp(this)
functions = FirebaseFunctions.getInstance()
val returnFC = functions.getHttpsCallable("stamp").call()
returnFC.continueWith task ->
val resultFC = task.result?.data as Map<String, Any>
resultFC["timeStamp"] as Long
ret = "$resultFC["timeStamp"]".toLong()
val cal = Calendar.getInstance()
cal.timeInMillis = "$ret".toLong()
var date = DateFormat.format("dd-MM-yyyy", cal).toString()
Log.d("current date:", date)
Log.d("timeStamp_from_function :", "$ret")
resultFC
returnFC.addOnSuccessListener
Log.d("OnSuccessListener :", "success")
returnFC.addOnFailureListener
Log.d("OnFailureListener:", "failure")
我收到退货并到达:TimestampConvert 看起来很棒
【讨论】:
【参考方案4】:根据我的经验(在 TS 和 React 中)....
import firebase from 'firebase/compat/app'; //v9
export const getNowTimeStamp = () =>
return firebase.firestore.Timestamp.now();
在导入方法之后
import getNowTimeStamp from '..path/to/firebase.utils';
console.log( getNowTimeStamp().toMillis() );
o/p:1631264447901
【讨论】:
以上是关于如何以毫秒为单位获取firebase服务器的当前时间戳?的主要内容,如果未能解决你的问题,请参考以下文章
如何像 Java 一样获取自 1970 年以来的当前时间戳(以毫秒为单位)
自Javascript中的unix时代以来,如何以毫秒为单位获取时间? [复制]