在前端使用Date对象获取当前时间的时候,该时间是客户端的时间。但是该时间可以被用户修改,所以我们一般情况下并不想要这个时间。如果每一次获取时间的时候都请求一下服务器,那么将会对服务器造成不必要的压力,我们也不想这么做。在网上找了一圈之后,发现了一些解决方案,就在这里总结一下

1.当系统被用户第一次打开的时候,发送请求(没必要写一个专门获取时间的API),根据http的相应头Date字段获取服务器时间。此时与客户端时间做差,并将差值记录下来。

2.为了防止客户端时间被用户修改,我们每隔2s(这个自定义吧)获取一下客户端时间,并将上一个时间和当前时间做差,看和2s差的大不大,正常情况下也就是几十毫秒的差值,我们在这里比方设为 1s。如果差值大于1s,我们就认为客户端时间被修改了,我们此时获取一下前一个时间和当前时间的差值再减去2s就是修改时候后的差值。

3.moment.js内部获取时间是使用的moment.now方法,我们把这个方法自定义一下就可以了

以下是代码实现:

	var diff = 0;           // 记录服务器和客户端的时间差值
var lastTime; // 记录上一次时间
$(function(){
$.ajax({
url: apiURL,
}).always(function(res, state, xhr){
var serverTime = new Date(xhr.getResponseHeader("Date")).getTime();
var localTime = +new Date;
diff = serverTime - localTime;
lastTime = localTime;
var InvertialMillSeconds = 2000;
var maxMillSeconds = 1000;
// 每InvertialSeconds毫秒检测一次当前时间,
// 若差值大于maxMillSeconds那么可以判断出客户端时间被修改了
setTimeout(function(){
var nowTime = +new Date;
var InverDiff = nowTime - (lastTime + InvertialMillSeconds);
if(Math.abs(InverDiff) > maxMillSeconds){
diff += InverDiff;
}
lastTime = nowTime;
setTimeout(arguments.callee, InvertialMillSeconds);
}, InvertialMillSeconds);
}) })

moment.now本来是这个样子的

	var now = function() {
return Date.now ? Date.now() : +(new Date());
};

我们在引入moment.js之后,重新修改该值为

	if (window.moment && window.moment.now) {
moment.now = function(){
return Date.now ? Date.now()+top.diff : (new Date().getTime() + top.diff);
}
}

到此,大功告成!

本文由博客一文多发平台 OpenWrite 发布!

moment.js 默认使用服务器时间的更多相关文章

  1. JS 中获取服务器时间的注意点

    在通过js获取服务器时间时,遇到了小小的问题,但造成的影响挺大的,所以写出来提醒大家,在获取服务器时间时一定要细心要多测试多验证. js 中使用以下方法获取服务器时间时要注意两点: 1.xhr.ope ...

  2. JS获取服务器时间并且计算距离当前指定时间差的函数

    项目中遇到了从服务器获取时间,现在记录一下方便以后查询: 1.后台代码:(创建一个date对象并以JSON的形式返回去) // 获取服务器时间 public String getNowServerTi ...

  3. JS根据服务器时间倒计时

    原文链接:http://caibaojian.com/daojishi-2.html //获取服务器时间 function getSevertime(){ var xmlHttp = new XMLH ...

  4. JS实现Ajax---例:获取服务器时间

    Ajax在本质上是一个浏览器端的技术 XMLHttpRequest XMLHttpRequest对象 XMLHttpRequest对象在IE浏览器和非IE浏览器中创建的方法不同. 简而言之:它可以异步 ...

  5. 利用JS获取本地时间和服务器时间

    <p id="labTime"> <script type="text/javascript"> //取客户端时间 setInterva ...

  6. js解决客户端与服务器时间不一致的问题

    引出 最近在写一个项目时,要根据时间进行不同的展示,直接用new Date().getTime()获取当前时间,结果就出问题了.有些用户擅自修改自己的本地时间,导致获取到的时间并不是当前时间,尴尬. ...

  7. JS中new Date()用法及获取服务器时间

    1.获取服务器时间: var now = new Date($.ajax({async: false}).getResponseHeader("Date")); 2.new Dat ...

  8. (转)网站速度优化技巧:Nginx设置js、css过期时间

    网站速度优化技巧:Nginx设置js.css过期时间 原文:http://www.webkaka.com/blog/archives/Nginx-set-the-expiration-time-for ...

  9. 通过自定义特性,使用EF6拦截器完成创建人、创建时间、更新人、更新时间的统一赋值(使用数据库服务器时间赋值,接上一篇)

    目录: 前言 设计(完成扩展) 实现效果 扩展设计方案 扩展后代码结构 集思广益(问题) 前言: 在上一篇文章我写了如何重建IDbCommandTreeInterceptor来实现创建人.创建时间.更 ...

随机推荐

  1. 理解Spark运行模式(三)(STANDALONE和Local)

    前两篇介绍了Spark的yarn client和yarn cluster模式,本篇继续介绍Spark的STANDALONE模式和Local模式. 下面具体还是用计算PI的程序来说明,examples中 ...

  2. nyoj 16-矩形嵌套(贪心 + 动态规划DP)

    16-矩形嵌套 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:13 submit:28 题目描述: 有n个矩形,每个矩形可以用a,b来描述,表示长和 ...

  3. VLAN实验(4)单臂路由

    1.选择1台Router路由器.2台S3700交换机和4台pc机,并根据实验编址完成此拓扑图. 2.对交换机mengyu-S2建立VLAN (1)建立两个VLAN,VLAN10和VLAN20,并添加描 ...

  4. windows anaconda python3.7 import ssl,psycopg2报错

    使用anaconda,本来是为了减少装第三方模块依赖出错问题的. 但是,今天发现,也是有坑啊. 首先 import ssl 报错,import _ssl 说DLL load failed 解决办法:用 ...

  5. 协议分层(因特网5层模型)及7层OSI参考模型

    目录 因特网5层模型及7层OSI参考模型 分层的体系结构: 应用层(软件) 运输层(软件) 网络层(硬件软件混合) 链路层(硬件) 物理层(硬件) OSI模型 表示层 会话层 封装 因特网5层模型及7 ...

  6. Linux下为知笔记和蚂蚁笔记测评,推荐蚂蚁笔记!(非广告)

    本人由于学习Linux,需要一款可以在Linux平台下可以运行的一款软件,了解到为知笔记之笔记(下文以W代替)和蚂蚁笔记(下文以M代替)比较出名,由于某云和某象笔记在linux平台下没有对应的软件,所 ...

  7. Altium Designer 18 画keepout层与将keepout层转换成Mechanical1层的方法

    画keepout的方法 先选中Keepout层:然后 右键->Place->Keepout->然后选择要画圆还是线 Keepout层一般只用来辅助Layout,不能作为PCB的外形结 ...

  8. IdentityServer4 保护.net framework webapi

    一.IS4服务器配置 1.新建一个Asp.net  Core MVC程序,模板选择 Empty 2.Nuget添加 IdentityServer4,我这里添加的是2.5.3 3.添加Config文件, ...

  9. P1087 FBI树

    题目描述 我们可以把由“00”和“11”组成的字符串分为三类:全“00”串称为BB串,全“11”串称为I串,既含“00”又含“11”的串则称为F串. FBIFBI树是一种二叉树,它的结点类型也包括FF ...

  10. CCNA 之 八 交换基础 VLAN TRUNK VTP

    交换基础 主要知识点: 二层交换基础 Vlan的概念 Trunk的概念 VTP 二层交换基本配置 首先来看下园区网分层结构 交换机的主要功能: Address learning 学习MAC地址 会维护 ...