如何以毫秒为单位获取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服务器的当前时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

如何以毫秒为单位获取当前时间?

如何在 PHP 中以毫秒为单位获取当前时间?

如何像 Java 一样获取自 1970 年以来的当前时间戳(以毫秒为单位)

自Javascript中的unix时代以来,如何以毫秒为单位获取时间? [复制]

如何从日期对象python获取以毫秒(秒后3位小数)为单位的时间值?

如何以毫秒为单位获取带有 unix 时间戳的人类可读日期? [复制]