我如何实现Angular2时钟

时间:2017-12-01 18:32:13

标签: javascript angular ionic2 rxjs

我尝试使用服务器时间戳实现angular2时钟,但遭到了攻击。第二个代码返回一个静态dateTime

def normalize(t):
    [n1, n2, dist] = t
    if n1 < n2:
        return t
    else:
        return [n2, n1, dist]

unique_edges = set(map(normalize, lis))

这会每秒更新,效果很好

this.clock = Observable.interval(1000).map(()=> new Date());

{{clock | async | date:'medium'}} 

这根本不会更新

1512151753372是服务器提供的时间戳

任何想法???

1 个答案:

答案 0 :(得分:3)

选项1(不要这样做......)

您可以为服务器上的日期播种.scan运算符播种,并按每秒递增它:

&#13;
&#13;
Rx.Observable
  .interval(1000)
	.scan(function (acc, x) {
    return new Date(acc.getTime() + 1000);
  }, new Date(1512151753372))
  .subscribe(x => { console.log(x); });
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.min.js"></script>
&#13;
&#13;
&#13;

这最终会漂移,因为它不会每秒都运行。它也没有解释像DST这样的异常情况。

选项2

这可能会更准确但你必须在外面做一些工作或rxjs来确定一些变量的范围:

&#13;
&#13;
const server = 1512151753372;
const now = Date.now();
Rx.Observable
  .interval(1000)
  .map(x => new Date(server + Date.now() - now))
  .subscribe(x => console.log(x));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.min.js"></script>
&#13;
&#13;
&#13;

这应避免#1中的漂移问题,但您仍应每隔15分钟从服务器获取一个新的时间戳,以避免DST问题。唯一应该发生的漂移是从服务器获取时间戳和使用Date.now()获取时间戳之间。

请注意,如果客户端更改了系统时钟,那么它可能会丢失您的时钟,直到您再次与服务器同步。

相关问题