Я попытался использовать угловые часы с использованием метки времени сервера, но получил поражение. второй код возвращает статическую дату
this.clock = Observable.interval(1000).map(()=> new Date());
{{clock | async | date:'medium'}}
это обновление в секунду, хорошо работает
this.clock = Observable.interval(1000).map(()=> new Date(1512151753372));
{{clock | async | date:'medium'}}
это не обновляется вообще
1512151753372 - это метка времени, предоставляемая сервером
Любая идея Пожалуйста?
Вы можете .scan
оператор .scan
засеянный датой с сервера, и увеличивать его каждую секунду следующим образом:
Rx.Observable
.interval(1000)
.scan(function (acc, x) {
return new Date(acc.getTime() + 1000);
}, new Date(1512151753372))
.subscribe(x => { console.log(x); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.min.js"></script>
Это, в конечном счете, дрейфует, потому что он не будет точно выполняться каждую секунду. Он также не учитывает аномалии, такие как DST.
Это, вероятно, было бы более точным, но вам нужно сделать небольшую работу за пределами или rxjs для охвата некоторых переменных:
const server = 1512151753372;
const now = Date.now();
Rx.Observable
.interval(1000)
.map(x => new Date(server + Date.now() - now))
.subscribe(x => console.log(x));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.min.js"></script>
Это должно избежать проблемы с дрейфом в # 1, но вы должны получать свежую метку времени от сервера каждые 15 минут, чтобы избежать проблем с DST. Единственный дрейф, который должен произойти, - это время, когда вы получили метку времени с сервера и когда вы засеиваете ее Date.now().
Обратите внимание, что если клиент изменяет свои системные часы, он, вероятно, сбросит ваши часы, пока вы снова не синхронизируете с сервером.