# #java #android #firebase #firebase-realtime-database
Вопрос:
Я хочу знать, как я могу получить правильное время в миллисекундах в Android на основе местоположения пользователя, даже если время в системе неверно или отличается от реального времени.
Я создаю приложение для чата с помощью Firebase, и мне нужно указывать отметку времени с каждым отправленным сообщением и хранить ее в Firebase, чтобы я мог показывать пользователям сообщения в порядке отметки времени.
Я попробовал следующий способ, но он не сработал, потому что он просто возвращает то же время, что и в системе, а не точное время —
DatabaseReference offsetRef = FirebaseDatabase.getInstance().getReference(".info/serverTimeOffset");
offsetRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
Log.d(TAG, "onDataChange: Time snapshot: " snapshot);
long offset = snapshot.getValue(Long.class);
long estimatedServerTimeMs = System.currentTimeMillis() offset;
}
}
@Override
public void onCancelled(DatabaseError error) {
System.err.println("Listener was cancelled");
}
});
Комментарии:
1. Проблема неясна, из-за чего трудно помочь. Что такое «правильное время»? Также: что не сработало в этом коде? Итак: когда вы устанавливаете точку останова в каждой строке и запускаете код в отладчике: какая первая строка не выполняет то, что вы ожидаете? Что сделала эта строка? А чего вы ожидали вместо этого?
2. Приношу извинения за неполную информацию.
3. Под правильным временем я подразумеваю фактическое время того места, где в данный момент находится пользователь. Например, если время звонка пользователя установлено на 10:00 утра, но фактическое время в местоположении пользователя составляет 1:00 вечера, в принципе, я хочу хранить точные отметки времени в базе данных для последовательного упорядочения чатов. Этот код просто возвращает неправильное время системы, когда я добавляю смещение в System.currentTimeMillis(). Я новичок в firebase, здесь я не совсем уверен.
4. Пожалуйста, проясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы точно указать, что вам нужно. Поскольку это написано в настоящее время, трудно точно сказать, о чем вы просите.
Ответ №1:
Все метки времени с Firebase/Firestore используют метки времени UTC и, как таковые, не имеют собственного смещения. Вместо этого вы должны записать смещение часового пояса с устройства пользователя и сохранить его вместе с сообщением или общедоступным профилем пользователя, куда вы можете позвонить с устройства, используя:
return TimeZone.getDefault().getOffset(System.currentTimeMillis());
Затем вы можете добавить его в метку времени сообщения пользователя, это связано с тем, что по умолчанию часовой пояс добавляется вашей собственной ОС при чтении в удобочитаемом формате.