#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