2013-08-23 4 views
0

Firebase의 docs about presence "클라이언트의 시계 왜곡"은 "서버 시간을 예측하기 위해 Firebase가 현지보고 시간 (에포크 시간 (밀리 초))에 추가하는 값"이라고 말합니다.Firebase의 시계 왜곡의 표시

그런 다음 예에서, 그것은 예를 들어 말한다 :

@Override 
public void onDataChange(DataSnapshot snapshot) { 
    double offset = snapshot.getValue(Double.class); 
    double estimatedServerTimeMs = System.currentTimeMillis() + offset; 
} 

내가 테스트에 사용할 하나의 안드로이드 장치에서 나는 시계를 변경 있도록 사분 (대략)에 의해 빠르게. 나는 자바 SDK를 통해 클럭 스큐를 얻을 때 지금, 내가 할 값은 다음과 같습니다

232599.0 

이 밀리 초 단위이기 때문에, 그것은 3.87665분에 해당합니다.

그러나 서버 시간에 대한 추정치를 얻으려면 로컬 타임 스탬프 (System.currentTimeMillis())에 추가해야합니다. 그게 맞습니까?

클라이언트의 시계가 이미 4 분 빠르며 I 을 추가하면 약 8 분이 소요됩니다.

그런데 setPriority()에서 서버 타임 스탬프를 사용할 수 있다면 완벽 할 것입니다. 현재 ServerValue.Timestamp은 원시 값이 아니기 때문에 setValue()에서만 사용할 수 있습니다. setPriority()에서 시간을 사용하려면 System.currentTimeMillis() 및 시계 왜곡을 사용하여 서버의 시간을 계산해야합니다.

답변

1

오프셋을 추가하여 서버와 관련된 현지화 된 시간을 결정합니다.

따라서 서버 시간이 08:05 인 경우 클라이언트의 속도가 10 분이면 클라이언트 시스템의 시계는 클라이언트에서 08:15 (00:10 분)입니다.

ServerValue.Timestamp를 사용하지 않고 시간을 되돌리려면 클라이언트 시간을 사용하여 서버와 일치 시키십시오 (예 : 08:15 - 00:10 = 08:05).

ServerValue.Timestamp가 도입되기 전에 프로젝트에서이 작업을 수행 한 방법과 비슷하게 작동합니다.

+0

예, 감사합니다 :) 이것은 내가 잘하고있는 일이지만, 문서에서 인용 한'onDataChange()'에서 어떻게 잘못되었는지 보지 않으시겠습니까? 그들은 본질적으로'estimatedServerTimeMs = System.currentTimeMillis() + offset'을 잘못 수행합니다. 그렇지 않습니까? – caw

+0

그건 그렇고,'ServerValue.Timestamp'를 사용할 때, 당신은 열쇠를 직접 지정할 수 없습니다.이 권리를 얻었습니까? 그 타입은'java.util.Map '입니다. 따라서 Java에서 다음과 같은 것은 불가능합니다 : https://www.firebase.com/docs/javascript/servervalue /TIMESTAMP.html – caw

+0

Marco, 서버 시간 (당장)이 오전 8:04이고 클라이언트에서 4 분 빠르면 8:04 (4 분 전)입니다. 8:08 (지금 당장)하려면 4를 더해야합니다. 나는 Firebase devs와 setPriority() 버그에 대해 이야기 해왔다. – Kato