前端要以服务器的时间为准,有啥好用的库吗?

2021-03-24 12:10:48 +08:00
 vinsony

场景是大量客户端电脑时间都不准,也没有时间同步,只能在程序里请求后端时间接口获取真实时间。

现在想法是程序只取一次服务器时间,然后在客户端模拟一个时间出来,关键要能支持 new Date 获取这个模拟时间,而且这个模拟时间能一直自动继续走。

这样的需求有啥好用的库吗?

8035 次点击
所在节点    JavaScript
46 条回复
lasuar
2021-03-24 12:13:46 +08:00
前端会 像服务器一样时刻运行着?
zvcs
2021-03-24 12:14:45 +08:00
加个 https 。如果他们时间不准就用不了
vinsony
2021-03-24 12:15:14 +08:00
我意思是程序运行的时候从服务器取一次时间
zhfapiu
2021-03-24 12:16:48 +08:00
计算服务端与客户端时间戳的差值,保存在前端
MakeItGreat
2021-03-24 12:17:53 +08:00
如果客户端的时间和服务器是有差值但是差值不变
那么根据两者固定的差值计算
jinsongzhao
2021-03-24 12:20:45 +08:00
没有什么库,因为需要由服务端配合, 你的服务端可以是 java 的,c#的,或者时间服务等等. 而客户端如果直接修改电脑时钟,又需要权限. 其实思路也非常简单, 自己实现好了. 服务端返回时间, 客户端本地时间和服务端时间做一个差值, 然后显示时间时,始终加上这个差值. 也不用什么定时同步, 客户端不会连续工作几十天,也不会几个小时就跑出几秒的误差
shenyuzhi
2021-03-24 12:23:31 +08:00
window.Date = function() {...}
opp
2021-03-24 12:44:24 +08:00
轮询吧,一次差值不靠谱。因为本机时间除了用户修改外,本身也会跳变,具体可搜下闹钟失效之类的案例。
chenqh
2021-03-24 12:47:29 +08:00
每次 api,都把服务器时间返回回去?
这个问题我也遇到过
ligolas
2021-03-24 12:53:00 +08:00
response header 里面默认就带有服务器时间的,Date 字段,但是因为 CORS 的原因,你默认读不到,可以在服务器端配置一下 cors 头,你就可以读到了,这个时间再加上通信的时间,就比较准确了
seki
2021-03-24 12:54:36 +08:00
实现个 ntp 算法
zhuweiyou
2021-03-24 13:21:20 +08:00
进来的时候 请求后端拿到服务器时间, 然后本地也 new Date, 做差值,

是有误差 但是差值是不变的.

后续只要 new Date + 差值 即可
fumichael
2021-03-24 13:59:06 +08:00
#10 response header +1
66beta
2021-03-24 14:02:37 +08:00
讲真,大部分项目 http 请求都是封装好的,拿不到 header
存差值比较合理
tiedan
2021-03-24 14:05:49 +08:00
所有接口加个默认字段也行
zhs227
2021-03-24 14:34:46 +08:00
存差值,多次按远近加权平均。
hailun3202475
2021-03-24 16:46:11 +08:00
我们之前的方案是 websocket 走心跳,假如每五秒一次心跳,每次心跳服务端都返回服务端时间,前端拿到时间做每次校验修正,前端时间也时刻在走
Hoshinokozo
2021-03-24 16:49:17 +08:00
@ligolas 通信的时间要怎么拿到呢?
jmk92
2021-03-24 18:32:15 +08:00
据我了解,一些用户机器的时间不准,即使同步了时间,可能还是过一天差一点,过不几天又不准了。
这个要牵扯到 CPU 时钟之类的,连他的机器都无法准确计算时间,你通过 js 算法 sleep 计算时间只会更不准。
所以只有跟服务器通信才是王道,websocket 是最优解,轮训对服务器压力大,也可以通过 10-30 秒一轮询,计算一下和本机的差值,时间等于差值+他的本地时间。
geekvcn
2021-03-24 19:24:14 +08:00
开个 gRPC 服务,websocket 不适合这种场景,要与时俱进

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/764592

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX