Как реализовать часы Angular2

1

Я попытался использовать угловые часы с использованием метки времени сервера, но получил поражение. второй код возвращает статическую дату

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 - это метка времени, предоставляемая сервером

Любая идея Пожалуйста?

  • 2
    Если вы хотите использовать второй пример кода, вам нужен механизм для регулярного обновления метки времени сервера. Как написано, это (1512151753372) является статическим числом, и оно не будет обновлено.
  • 0
    я не могу запросить сервер в секунду, я хочу получить текущую метку времени с сервера, тогда время клиента может начинаться с последней запрошенной метки времени сервера
Теги:
angular
rxjs
ionic2

1 ответ

3
Лучший ответ

Вариант 1 (не делайте этого...)

Вы можете .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.

Вариант 2

Это, вероятно, было бы более точным, но вам нужно сделать небольшую работу за пределами или 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().

Обратите внимание, что если клиент изменяет свои системные часы, он, вероятно, сбросит ваши часы, пока вы снова не синхронизируете с сервером.

  • 0
    я работаю над приложением для проверки приложения таким образом, чтобы продолжительность (время) определялась сервером ... к сожалению, я не могу продолжать запрашивать сервер раз в секунду. я могу только запросить у сервера информацию о текущем времени, а затем позволить клиентскому времени начать отсюда
  • 0
    @netx Вы делаете обратный отсчет?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню