我尝试使用服务器时间戳实现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是服务器提供的时间戳
任何想法???
答案 0 :(得分:3)
您可以为服务器上的日期播种.scan
运算符播种,并按每秒递增它:
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;
这最终会漂移,因为它不会每秒都运行。它也没有解释像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));
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.min.js"></script>
&#13;
这应避免#1中的漂移问题,但您仍应每隔15分钟从服务器获取一个新的时间戳,以避免DST问题。唯一应该发生的漂移是从服务器获取时间戳和使用Date.now()获取时间戳之间。
请注意,如果客户端更改了系统时钟,那么它可能会丢失您的时钟,直到您再次与服务器同步。