moment.js 默认使用服务器时间
在前端使用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 默认使用服务器时间的更多相关文章
- JS 中获取服务器时间的注意点
在通过js获取服务器时间时,遇到了小小的问题,但造成的影响挺大的,所以写出来提醒大家,在获取服务器时间时一定要细心要多测试多验证. js 中使用以下方法获取服务器时间时要注意两点: 1.xhr.ope ...
- JS获取服务器时间并且计算距离当前指定时间差的函数
项目中遇到了从服务器获取时间,现在记录一下方便以后查询: 1.后台代码:(创建一个date对象并以JSON的形式返回去) // 获取服务器时间 public String getNowServerTi ...
- JS根据服务器时间倒计时
原文链接:http://caibaojian.com/daojishi-2.html //获取服务器时间 function getSevertime(){ var xmlHttp = new XMLH ...
- JS实现Ajax---例:获取服务器时间
Ajax在本质上是一个浏览器端的技术 XMLHttpRequest XMLHttpRequest对象 XMLHttpRequest对象在IE浏览器和非IE浏览器中创建的方法不同. 简而言之:它可以异步 ...
- 利用JS获取本地时间和服务器时间
<p id="labTime"> <script type="text/javascript"> //取客户端时间 setInterva ...
- js解决客户端与服务器时间不一致的问题
引出 最近在写一个项目时,要根据时间进行不同的展示,直接用new Date().getTime()获取当前时间,结果就出问题了.有些用户擅自修改自己的本地时间,导致获取到的时间并不是当前时间,尴尬. ...
- JS中new Date()用法及获取服务器时间
1.获取服务器时间: var now = new Date($.ajax({async: false}).getResponseHeader("Date")); 2.new Dat ...
- (转)网站速度优化技巧:Nginx设置js、css过期时间
网站速度优化技巧:Nginx设置js.css过期时间 原文:http://www.webkaka.com/blog/archives/Nginx-set-the-expiration-time-for ...
- 通过自定义特性,使用EF6拦截器完成创建人、创建时间、更新人、更新时间的统一赋值(使用数据库服务器时间赋值,接上一篇)
目录: 前言 设计(完成扩展) 实现效果 扩展设计方案 扩展后代码结构 集思广益(问题) 前言: 在上一篇文章我写了如何重建IDbCommandTreeInterceptor来实现创建人.创建时间.更 ...
随机推荐
- 区块链原理、设计与应用pdf电子版下载
链接:https://pan.baidu.com/s/1koShkDjEYOXxLOewZJU2Rw 提取码:8ycx 内容简介 · · · · · · 本书由专业区块链开发者撰写,是区块链开发起步 ...
- Github PageHelper 原理解析
任何服务对数据库的日常操作,都离不开增删改查.如果一次查询的纪录很多,那我们必须采用分页的方式.对于一个Springboot项目,访问和查询MySQL数据库,持久化框架可以使用MyBatis,分页工具 ...
- Python 面向对象-上篇
概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...
- 通过django 速成 blog
1. 创建项目 33进入在python目录下的scripts文件后执行 django-admin.py startproject mysite 这样就生成了名为mysite ...
- 构思一个在windows下仿objc基于动画层ui编程的ui引擎
用c/c++编程有些年了,十个指头可以数齐,在涉入iOS objc开发后,有种无比舒服的感觉,尤其在UI开发上. 在QuartzCore.framework下动画和透明窗口等许多效果的事都变得那么方便 ...
- 小白学习React官方文档看不懂怎么办?2.JSX语法
接下来我们就要讲到JSX语法了,在我们讲它之前,我们先引入一个概念叫语法糖. 听到这个名字首先我们可能会想到一个词叫”糖衣炮弹“,那么什么叫糖衣炮弹呢,就是给你说各种好听的话,来迷惑你,但 ...
- jdbc-mysql测试例子和源码详解
目录 简介 什么是JDBC 几个重要的类 使用中的注意事项 使用例子 需求 工程环境 主要步骤 创建表 创建项目 引入依赖 编写jdbc.prperties 获得Connection对象 使用Conn ...
- 16 Zabbix4.4.1系统告警“Zabbix agent is not available (for 3m)“
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Zabbix4.4.1系统告警“Zabbix agent is not available (fo ...
- API更新#图书信息查询ISBN2.0
ISBN图书查询 自2019年5月8日公布isbn查询接口1.0至今,该图书数据查询服务已被调用八万余次,查得图书11653本,感谢一直使用和关心这个接口的朋友们! 目前网站域名将于2019年 ...
- Java入门系列之集合HashMap源码分析(十四)
前言 我们知道在Java 8中对于HashMap引入了红黑树从而提高操作性能,由于在上一节我们已经通过图解方式分析了红黑树原理,所以在接下来我们将更多精力投入到解析原理而不是算法本身,HashMap在 ...