你能从Firebase实时数据库密钥中获取时间戳吗?

你能从Firebase实时数据库密钥中获取时间戳吗?,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,据此,firebase数组键使用时间戳创建: 它通过基于当前时间戳(与服务器时间匹配的偏移量)分配一个永久的、唯一的id来实现这一点 有没有办法恢复此时间戳以供以后使用,因为有了密钥?正如我在评论中所说的,您不应该依赖于从生成的id解码时间戳。相反,您只需将其存储在Firebase的属性中即可。 也就是说,取回时间戳相当容易: //不要在生产中使用此代码,因为它依赖于内部 //FIREBASE的实现细节 var PUSH_CHARS=“-0123456789abcdefghijklmnopqr

据此,firebase数组键使用时间戳创建:

它通过基于当前时间戳(与服务器时间匹配的偏移量)分配一个永久的、唯一的id来实现这一点


有没有办法恢复此时间戳以供以后使用,因为有了密钥?

正如我在评论中所说的,您不应该依赖于从生成的id解码时间戳。相反,您只需将其存储在Firebase的属性中即可。

也就是说,取回时间戳相当容易:

//不要在生产中使用此代码,因为它依赖于内部
//FIREBASE的实现细节
var PUSH_CHARS=“-0123456789abcdefghijklmnopqrstuvxyz”abcdefghijklmnopqrstuvxyz”;
函数解码(id){
id=id.substring(0,8);
var时间戳=0;
对于(变量i=0;i
以下是用Swift重新编写的版本(撰写本文时为4.2版)

需要明确的是,我的使用案例是在没有时间戳的情况下修补我的旧模型(
createdAt
updatedAt
),我可以在它们中加入随机日期来省去一些麻烦。但这与他们的模型无关。我知道,根据我从其他文章中读到的内容,这些自动ID中有一个时间元素

let PUSH_CHARS = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"

func decode(autoId: String) -> TimeInterval {
  let substring = autoId.substring(toIndex: 8)
  var timestamp = 0
  for i in 0..<substring.length {
    let c = Character(substring[i])
    timestamp = (timestamp * 64) + PUSH_CHARS.firstIndex(of: c)!.encodedOffset
  }
  return TimeInterval(exactly: timestamp)!
}
let PUSH_CHARS=“-0123456789abcdefghijklmnopqrstuvxyz_abcdefghijklmnopqrstuvxyz”
func解码(autoId:String)->TimeInterval{
让substring=autoId.substring(toIndex:8)
var时间戳=0
对于0..和python中的i

PUSH_CHARS = "-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"

def get_timestamp_from_id(id):
    timestr = id[0:8]
    timestamp = 0
    for idx, ch in enumerate(timestr):
        timestamp = timestamp * 64 + PUSH_CHARS.index(ch)
    return timestamp/1000

即使您可以从密钥中检索时间戳,这也不是一个好主意。时间戳用于生成一个唯一的、按时间顺序排列的序列。如果Firebase有人想出一种更有效的方法(无论他们选择哪种效率的主观定义)为了实现相同的目标,他们可能会更改
push
的算法。如果您的代码需要时间戳,您应该将时间戳添加到数据中;而不是依赖于它是密钥的一部分。如果您想进行反向工程:推送Id是从
NextPushId
中的时间戳生成的(您可以搜索“NextPushId=function”来快速找到它。让我重申这是个坏主意。使用Firebase.ServerValue.TIMESTAMP。将时间戳存储在数据中。它可排序、可查询且可靠。我认为它很好地回答了这个问题。我只是认为这不是正确的问题。(虽然我在一年前问过同样的问题;这实际上是一个dup,但我找不到原件)因此,接受但否决是正确的做法。除非你找到了副本,否则你应该将问题标记为dup.:-)用于生成密钥的算法现在记录在Firebase博客中:。Firebase的一致意见似乎是,他们仍然建议在生产中不要依赖于此,而是使用
Firebase.ServerValue.TIMESTAMP
。事实上,博客文章重申了这一事实,并解释了该方法更可取的另一个原因。Th如果您需要添加时间戳,则是一个很大的帮助。基于此,您可以为旧值重新创建所有时间戳。因此,我向上投票。:)