Solución:
ServerValue.timestamp()
funciona de forma un poco diferente a la configuración de datos normales en Firebase. En realidad, no proporciona una marca de tiempo. En cambio, proporciona un valor que le dice al servidor de Firebase que complete ese nodo con la hora. Al usar esto, las marcas de tiempo de su aplicación vendrán todas de una fuente, Firebase, en lugar de lo que diga el dispositivo del usuario.
Cuando recupere el valor (de un observador), obtendrá el tiempo en milisegundos desde la época. Deberá convertirlo en segundos para crear un NSDate. Aquí hay un fragmento de código:
let ref = Firebase(url: "<FIREBASE HERE>")
// Tell the server to set the current timestamp at this location.
ref.setValue(ServerValue.timestamp())
// Read the value at the given location. It will now have the time.
ref.observeEventType(.Value, withBlock: {
snap in
if let t = snap.value as? NSTimeInterval {
// Cast the value to an NSTimeInterval
// and divide by 1000 to get seconds.
println(NSDate(timeIntervalSince1970: t/1000))
}
})
Es posible que obtenga dos eventos con marcas de tiempo muy cercanas. Esto se debe a que el SDK tomará una mejor “suposición” en la marca de tiempo antes de recibir noticias de Firebase. Una vez que escuche el valor real de Firebase, volverá a generar el evento Value.
Para mí en swift 5 uso en otra clase:
import FirebaseFirestore
init?(document: QueryDocumentSnapshot) {
let data = document.data()
guard let stamp = data["timeStamp"] as? Timestamp else {
return nil
}
let date = stamp.dateValue()
}
Esta pregunta es antigua, pero recientemente tuve el mismo problema, así que daré una respuesta.
Aquí puede ver cómo estoy guardando una marca de tiempo en Firebase Database
let feed = ["userID": uid,
"pathToImage": url.absoluteString,
"likes": 0,
"author": Auth.auth().currentUser!.displayName!,
"postDescription": self.postText.text ?? "No Description",
"timestamp": [".sv": "timestamp"],
"postID": key] as [String: Any]
let postFeed = ["(key)" : feed]
ref.child("posts").updateChildValues(postFeed)
La línea de código particularmente relevante es "timestamp": [".sv": "timestamp"],
Esto guarda la marca de tiempo como un doble en su base de datos. Este es el tiempo en milisegundos, por lo que debe dividirlo por 1000 para obtener el tiempo en segundos. Puede ver una marca de tiempo de muestra en esta imagen.
Para convertir este doble en una fecha, escribí la siguiente función:
func convertTimestamp(serverTimestamp: Double) -> String {
let x = serverTimestamp / 1000
let date = NSDate(timeIntervalSince1970: x)
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .medium
return formatter.string(from: date as Date)
}
Esto da una marca de tiempo que se ve así: