Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set epoch in Firestore using server time

I'm trying to set the epoch when data is created in Firestore. I'm looking to get some similar result to what is done in the real-time database, using ServerValue.TIMESTAMP.

I don't want to set it by using the device time System.getCurrentMillis because that time can be changed by the user.

According to docs an update needs to be done, the problem with that is the format. This is my code:

Map<String, Object> map = new HashMap<>();
map.put("timestamp", FieldValue.serverTimestamp());
reference.update(map);

And this is the result in the Firebase web console:

enter image description here

I was very surprised it is in spanish, which could be useful in some situations but epoch is what I'm chasing. Try to see the bright side and stick with it and thought that I was seeing the web in spanish, so I changed the language in the footer selector, it didn't change. On this point I'm assuming is set in the project language.

Back to the epoch attempt. Considering my project is using the real-time database as well, I try to set it in that way:

Map<String, Object> map = new HashMap<>();
map.put("timestamp", ServerValue.TIMESTAMP);
reference.update(map);

It did upload something, but it was just nonsense.

enter image description here

I think using epoch as the server-side timestamp is a better standard approach, after that every client can transform it to the user convenience and locale.

Can the epoch by set as server value in Firestore?

UPDATE

The answer marked as correct lead me to some interesting findings that I would like to share, so others in the same situation can benefit from:

  • There is no need to set the epoch because of the FieldValue.serverTimestamp() it is a date object handled by the database, what we see in the console is just a friendly way to show it.
  • Since FieldValue.serverTimestamp() is a date object it can be sort as any other timestamp could be, if you add orderBy("timestamp", Query.Direction.DESCENDING) to your query (or Query.Direction.ASCENDING) it will sort the results correctly.
  • And regarding to a the @34m0 comment, that is right, clients should not take care of the logic for setting the creation time, but it should be done in Functions.
like image 688
cutiko Avatar asked Oct 20 '17 14:10

cutiko


1 Answers

The object that results from setting a Firestore field with FieldValue.serverTimestamp() is an instance of java.util.Date. When you later read the value, you can get the epoch time using getTime().

As an example, for a document created like this:

Map<String, Object> doc = new HashMap<>();
doc.put("timestamp", FieldValue.serverTimestamp());

The resulting value can be read like this:

docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot snapshot = task.getResult();
            if (snapshot != null) {
                Map<String,Object> map = snapshot.getData();
                Date date = (Date) map.get("timestamp");
                Log.d(TAG, "date=" + date);
                Log.d(TAG, "time=" + date.getTime());
            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get() failed with ", task.getException());
        }
    }
});
like image 127
Bob Snyder Avatar answered Oct 28 '22 19:10

Bob Snyder