Получите правильную метку времени для приложения для чата в Android, firebase

# #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());
 

Затем вы можете добавить его в метку времени сообщения пользователя, это связано с тем, что по умолчанию часовой пояс добавляется вашей собственной ОС при чтении в удобочитаемом формате.