Как я могу получить метку времени с сервера Firestore, не беспокоясь о случае, когда часы устройства не синхронизированы c с Firestore - PullRequest
1 голос
/ 25 января 2020

Это относится к этому вопросу Разница в метках времени Firebase между текущей меткой времени и ошибкой метки времени в базе данных

Если я использую Timestamp.now(), существуют случаи, когда часы устройства не синхронизированы c с Firestore и мои расчеты времени не точны. Я хочу получить точное время с сервера Firestore, не беспокоясь о несинхронных случаях. Есть ли способ, которым я мог бы сделать это?

Я видел FieldValue.serverTimestamp(), но там я не могу найти способ вычислить что-либо, используя его, так как тип возвращаемого значения - FieldValue, и я не могу разобрать его в Timestamp.

Ответы [ 2 ]

1 голос
/ 26 января 2020

Один очевидный, но экономически неблагоприятный способ - записать в базу данных Firestore временную метку и снова прочитать ее оттуда.

db.collection("TimestampChecker").document("some_string").set(new TimestampGetter()).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {

            db.collection("TimestampChecker").document("some_string").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    if(task.getResult()!=null)
                    {
                        TimestampGetter timestampGetter = task.getResult().toObject(TimestampGetter.class);
                        Date dateNow = timestampGetter.getTimestampNow();

                    }

                }
            });

        }
    });

И TimestampGetter может быть следующим классом:

public class TimestampGetter {
@ServerTimestamp
private Date timestampNow;

public TimestampGetter(Date timestampNow) {
    this.timestampNow = timestampNow;
}

public TimestampGetter() {
}

public Date getTimestampNow() {
    return timestampNow;
}

public void setTimestampNow(Date timestampNow) {
    this.timestampNow = timestampNow;
}}
1 голос
/ 25 января 2020

Если вы используете FieldValue.serverTimestamp(), это означает, что вы позволили Firestore сгенерировать для вас временную метку. Обратите внимание, что эта временная метка генерируется полностью на сервере. Он не генерируется как идентификаторы документов, например, на клиенте.

Я не могу найти способ рассчитать что-либо, используя его, так как его тип возвращаемого значения - FieldValue, и я не могу проанализировать его в Timestamp.

При вызове метода serverTimestamp () FieldValue тип возвращаемого объекта - FieldValue, но этот аргумент передавался в качестве аргумента только тогда, когда вам нужно это свойство отметки времени. Пожалуйста, проверьте, как вы можете добавить метку времени в документ Cloud Firestore:

Так что если вы запросите базы данных, и вы получите документ, свойство которого было установлено с помощью FieldValue.serverTimestamp(), тип возвращаемого объекта - Дата . Поскольку вы получаете объект Date обратно, вы можете делать с ним все, что захотите.

Однако в базе данных Firebase Realtime у нас есть другой механизм. Пожалуйста, посмотрите этот ответ:

Итак, в в этом случае все совершенно иначе, так как мы используем время с Unix эпохи, в миллисекундах, а не Date объект.

Edit:

It Похоже, ваш вопрос начался с того, как получить метку времени из Firestore, но на самом деле это просто вопрос о том, как структурировать документ, чтобы два устройства могли читать один и тот же документ. Однако, чтобы это работало, вы должны использовать два свойства типа Date. Один для устройства A и один для устройства B. Проверьте схему ниже:

Firestore-root
   |
   --- yourCollection (collection)
        |
        --- yourDocument (document)
              |
              --- deviceA: January 24, 2020 at 3:37:59 PM UTC+3 
              |
              --- deviceB: January 25, 2020 at 3:37:59 PM UTC+3 //Timestamp

Чтобы получить значения свойств deviceA и deviceB, используйте мой ответ из следующего поста:

Теперь вы можете сравнить обе отметки времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...