如何以毫秒为单位获取Firebase服务器的当前时间戳?

23

我想获取Firebase当前时间戳,但是找不到方法来获取它。我想要像图片中展示的那样保存子项。为此,我需要获取时间戳并相应地获取日期。请帮忙……

这是我想要获得的结果


你的意思是想将服务器时间设置为这种格式(dd-mm-yyyy)的键吗? - Wilik
@wilik. 是的,正是如此。 - Brijesh Kumar
提醒一下,Firebase在最新版本的Firestore 5.4.1中更改了时间戳的行为。 - TheBen
4个回答

28
您可以使用ServerValue.TIMESTAMP来设置服务器时间,它是一个Map<String, String>类型,其中包含{".sv" : "timestamp"}对。当它被发送到Firebase数据库时,它将被转换为长整型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)保存它,有一种方法但不建议使用。首先需要将其保存在另一个临时节点中 (ServerValue.TIMESTAMP),然后检索时间戳并使用 Date 类将其转换为该格式。请注意,保留HTML标记。

非常感谢。我尝试过了,它正常工作。我也可以这样做。但是,是否有可能将ServerValue.TIMESTAMP作为密钥使用? - Brijesh Kumar
不客气。我认为这是可能的,但需要进行两个API调用:首先设置TIMESTAMP值,然后使用“Query.limitToLast(1);”获取最后一个键。但这并不推荐,因为有可能两个用户同时插入了两个TIMESTAMPs,所以你无法获取正确的键。顺便说一下,如果您认为我的答案可以接受,请将其标记为已接受。 :) - Wilik

9
实际上,您可以使用云函数,并通过HTTP请求获取时间戳。该函数非常简单。
exports.getTimeStamp = functions.https.onRequest((req, res)=>{
  res.setHeader('Content-Type', 'application/json');
  res.send(JSON.stringify({ timestamp: Date.now() }));
});

2
从技术上讲,这将获取节点js服务器的时间戳,理论上可能与Firebase或Firestore数据库所在的服务器不同。 - Jonathan
1
@Jonathan 感谢您提出这个问题。Unix时间戳是指特定日期与Unix纪元(1970年1月1日UTC 00:00:00)之间的秒数,因此从技术上讲,无论您身处何地,它都不会改变,这就是为什么它在计算机系统中被广泛使用的原因。 - abdoo_salem
1
谷歌服务器将被正确设置,但其他服务器可能会有错误的时间,无论时间戳是否正确。 - Jonathan

1
在我的经验中(在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 可以翻译为:输出:1631264447901。

1

在安卓上,我是这样做的

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 看起来很不错


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接