Как получить метку времени сервера из Firestore на устройстве android? - PullRequest
0 голосов
/ 25 января 2020

Это связано с этим вопросом: Как я могу получить метку времени с сервера Firestore, не беспокоясь о случае, когда часы устройства не синхронизированы c с Firestore

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

Ответы [ 2 ]

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

Невозможно получить метку времени сервера из Firestore без использования операции с базой данных.

Вместо этого вы можете написать Облачная функция (вероятно, HTTP-триггер или функция вызываемого типа ), которая возвращает текущее время и вызывает его непосредственно у клиента, чтобы получить эту метку времени. Это избавляет от необходимости работать с базой данных, и вы получите одно и то же время, поскольку все сервисы Google имеют синхронизированные часы.

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

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

Итак, если у вас есть схема базы данных, которая выглядит следующим образом:

Firestore-root
   |
   --- users (collection)
        |
        --- uidOne (document)
              |
              --- name: "UserOne"
              |
              --- creationDate: January 25, 2020 at 3:37:59 PM UTC+3 //Timestamp

Чтобы получить значение свойства creationDate как объекта Date, используйте следующие строки кода:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference usersRef = rootRef.collection("users");
usersRef.document(uid).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        DocumentSnapshot document = task.getResult();
        if (document.exists()) {
            Date creationDate = document.getDate("creationDate");
            //Do what you need to do with your Date object
        }
    }
});

Помните, чтобы получить этот Date объект, нужно установить дату, как объяснено в моем ответе из следующего поста:

Редактировать:

Подчеркнут вопрос, чтобы получить метку времени сервера без выполнения каких-либо операций, связанных с базой данных.

Нет способа сделать это, так как это значение метки времени генерируется исключительно серверами Firebase. Другими словами, когда происходит операция записи, генерируется эта временная метка. Вы не можете смоделировать это на клиенте, и это имеет смысл, поскольку вы не можете случайным образом сгенерировать временную метку сервера самостоятельно. Это могут делать только серверы Firebase. Если вам нужна конкретная временная метка, вы должны , а не генерировать ее таким образом. Поскольку это свойство имеет тип Date, вы можете установить для него любую дату, какую пожелаете. Поэтому вместо того, чтобы позволить Firestore решить, какую временную метку генерировать, установите Date самостоятельно.

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