Reputation: 860
I want to save the current date/time in specific field when I add new value to Firebase Realtime Database via control panel.
How can I achieve that?
Please help me.
Upvotes: 26
Views: 56980
Reputation: 1
use Timestamp available in firebase/firestore and for node. https://firebase.google.com/docs/reference/node/firebase.firestore.Timestamp
Upvotes: 0
Reputation: 138824
The best practice is to save your data as a TIMESTAMP
like this ServerValue.TIMESTAMP
.
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
Map map = new HashMap();
map.put("timestamp", ServerValue.TIMESTAMP);
ref.child("yourNode").updateChildren(map);
Also remember, when you set the TIMESTAMP
, you set it as a Map
, but when you retrieve it, you retrieve it as a Long
. To get the data back, i suggest you use this method:
public static String getTimeDate(long timestamp){
try{
DateFormat dateFormat = getDateTimeInstance();
Date netDate = (new Date(timestamp));
return dateFormat.format(netDate);
} catch(Exception e) {
return "date";
}
}
Edit: The model class should look like this:
public class YourModelClass {
//private fields
private Map<String, String> timestamp;
public YourModelClass() {}
//public setters and getters for the fields
public void setTimestamp(Map<String, String> timeStamp) {this.timestamp= timestamp;}
public Map<String, String> getTimestamp() {return timestamp;}
}
Remember, ServerValue.TIMESTAMP
is just a token that Firebase Realtime Database converts to a number on server side when it's used as a child value during write operation. The date only appears in the database after the write operation completes.
To get the timestamp
, there is also another approach, which would be to write a frunction in Cloud Functions for Firebase and it will be as easy as:
exports.currentTime = functions.https.onRequest((req, res) => {
res.send({"timestamp":new Date().getTime()})
})
You can host this in Cloud Function and get the server timestamp without user interaction.
Upvotes: 36
Reputation: 3922
Alex Mamo is right but then this is how you should pass incase you call it from a model class
public class FirebMessage {
public String message;
public String senderPhoneNumber;
public String receiverPhoneNumber;
public Map time;
public FirebMessage() {
}
public FirebMessage(String message, String senderPhoneNumber, String receiverPhoneNumber, Map time) {
this.message = message;
this.senderPhoneNumber = senderPhoneNumber;
this.receiverPhoneNumber = receiverPhoneNumber;
this.time = time;
}
Then consume as follows
private void writeNewMessage(String message, String receiver,String sender) {
FirebMessage firebMessage = new FirebMessage(message, receiver,sender,ServerValue.TIMESTAMP);
mDatabase.child("messages").push().setValue(firebMessage, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError != null) {
Log.e(TAG,"Data Not saved");
} else {
Log.e(TAG,"Data saved successfully");
}
}
});
}
Upvotes: 4
Reputation: 896
Use data type Number into Firebase.
Upvotes: 2