Как вы можете получить серверное время из Firebase

#javascript #angularjs #date #server-side #firebase

#javascript #angularjs #Дата #на стороне сервера #firebase

Вопрос:

Я использую angularjs с firebase и когда я использую

 $scope.createdDate = new Date();
  

он использует время на клиенте, однако я хочу использовать текущее время серверов Firebase, поскольку время на стороне клиента может меняться. Как я могу сделать это в angular?

Комментарии:

1. это так? firebase.com/docs/managing-presence.html#server-timestamps

2. Большое спасибо @JonasGrumann.

Ответ №1:

При печати firebase.database.ServerValue.TIMESTAMP он выдаст вам этот объект {.sv: "timestamp"}

Чтобы получить временную метку сервера firebase на клиенте, вам сначала нужно записать значение на сервер, а затем прочитать значение.

  firebase.database().ref('currentTime/').update({ time: firebase.database.ServerValue.TIMESTAMP })
    .then(function (data) {
      firebase.database().ref('currentTime/')
        .once('value')
        .then(function (data) {

          var t = data.val()['time'];
          console.log('server time: ', t);

        }, function serverTimeErr(err) {
          console.log('coulnd nt reach to the server time !');
        });
    }, function (err) {
      console.log ('set time error:', err)
    });
  

Я думаю, что должен быть более простой способ напрямую считывать временную метку сервера с клиента.

редактировать 1: только что найденный лучший способ использует 1 вызов firebase

 firebase.database().ref('/.info/serverTimeOffset')
  .once('value')
  .then(function stv(data) {
    console.log(data.val()   Date.now());
  }, function (err) {
    return err;
  });
  

Комментарии:

1. эй, я использовал ваш метод, но я продолжаю получать неправильную дату

2. как вы узнаете, что это неправильно? Это время на сервере firebase.

3. я получил эту временную метку = 1535916727292, которая равна 07 апреля 50641. Это нормально?

4. @FirasChebbah Это мс с эпохи, а не секунды. Разделите на 1000, если вам нужны секунды.

5. @canbax Я не говорю об атомной точности. Для игр некоторые пользователи меняют часы своего устройства, чтобы обойти временные ограничения, налагаемые играми. Например, если есть ежедневная реклама, которую они могут смотреть только один раз в день, они устанавливают свои часы на 24 часа вперед, чтобы видеть несколько объявлений в день. В этих случаях вам нужно серверное время, поступающее с сервера, без проверки часов устройства. Первое решение в этом ответе работает для этого варианта использования.

Ответ №2:

Для firebase3, пожалуйста, используйте firebase.database.Значение сервера.ВРЕМЕННАЯ МЕТКА

 $scope.createdDate = firebase.database.ServerValue.TIMESTAMP
  

документ здесь

Комментарии:

1. Есть ли способ получить серверное время, не устанавливая его сначала? (Довольно странно устанавливать его, затем получать его с помощью a один раз, затем попытаться учесть задержку, затраченную на его установку, а затем получить его и, наконец, стереть).

2. Я не очень хорошо понял, дорогая. Вы можете использовать firebase.database. Значение сервера. ОТМЕТКА ВРЕМЕНИ в любое время без использования метода .set или других.

3. При попытке получить доступ к содержимому firebase.database. Значение сервера. ВРЕМЕННАЯ МЕТКА со стороны клиента выдает объект {.sv: «timestamp»} . Я считаю, что это ссылка, которая автоматически заменяется на стороне сервера при установке или обновлении.

4. Проверено в этой ссылке на документы : значение сервера. TIMESTAMP — это значение-заполнитель для автоматического заполнения текущей временной метки (время, прошедшее с эпохи Unix, в миллисекундах) серверами баз данных Firebase.

Ответ №3:

Спасибо Джонасу Груманну за указание этого документа firebase о том, как добавить серверное время из firebase.

 // Get created date from Firebase servers
var createdDate = new Firebase('https://somedomain.firebaseIO.com/post/createDate');
createdDate.set(Firebase.ServerValue.TIMESTAMP);
  

Ответ №4:

2020: теперь вы можете использовать firebase.firestore.Timestamp.now() для получения времени UNIX с сервера. Он возвращает объект, который выглядит следующим образом:

 {
    seconds: NUM_OF_SECONDS,
    nanoseconds: NUM_OF_NANOSECONDS
}
  

Из этого в документах.

Комментарии:

1. Я почти уверен, что now() функция на клиенте не выполняет запрос сервера. Вместо этого он вернет текущую дату клиента. В документации говорится: «Создает новую временную метку с текущей датой с точностью до миллисекунды».

2. Я только что протестировал его, изменив часы своего компьютера. firebase.firestore.Timestamp.now() возвращает время клиента.

3. ДА… похоже, что это невозможно сделать без облачной функции? 🙁 @JohnnyOshika

4. @DaniilKunin Да, вам нужно будет вызвать сервер где-нибудь, чтобы получить надежное серверное время

5. имеет смысл! 👍 @JohnnyOshika