Я знаю, что этот вопрос уже был дан ответ, но я хотел бы поделиться моей версии решения.
Когда я использую временную метку сервера, я обычно нужно использовать его более чем один раз, т.е. у меня есть какие-то startTime
и endTime
которые оба зависят от времени сервера, где startTime
является NOW
и endTime
составляет X секунд/минут/часов после startTime
, поэтому, чтобы сэкономить несколько запросов на сервере, я сохраняю время сервера в корневом дочернем элементе с именем serverTime
в базе данных и использую его для установки всех зависимых значений.
Другое дело, поскольку Firebase работает с ServerValue.Timestamp
, в итоге он запускает 2 события (добавленные и измененные), первый с локальной меткой времени, а второй с меткой времени реального сервера. Поэтому, чтобы решить проблему не получения правильного времени, я добавил простой OnCompleteListener
.
Краткий пример кода:
import android.support.annotation.NonNull;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.ServerValue;
import com.google.firebase.database.ValueEventListener;
public class ServerTime {
public interface OnTimeRetrievedListener {
void onTimeRetrieved(Long timestamp);
}
private final DatabaseReference db;
public ServerTime(DatabaseReference db) {
this.db = db.child("serverTime");
}
/**
* Gets the server's timestamp in milliseconds.
* @param listener {@link OnTimeRetrievedListener}
*/
public void getTime(final OnTimeRetrievedListener listener) {
if (listener == null) {
return;
}
db.setValue(ServerValue.TIMESTAMP).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
db.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
listener.onTimeRetrieved(dataSnapshot.getValue(Long.class));
}
@Override
public void onCancelled(DatabaseError databaseError) { }
});
}
});
}
}
См http://stackoverflow.com/a/25308684/209103 –
Спасибо, но я хотел бы знать синтаксис в Java, а не Javascript , как в ответе. Любой, кто может перевести этот фрагмент js? :) – user3537089
Это был вопрос Java/Android, но на самом деле этот ответ основан на JavaScript. ОП нашел решение и разместил его, но после его удаления. Может быть, вы все равно можете получить доступ к нему по адресу http://stackoverflow.com/a/25321169/209103 –