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来实现创建人.创建时间.更 ...
随机推荐
- 基于Windows下永久破解jetbrains公司的系列产品(Idea, pycharm,clion,phpstorm)
基于Windows下永久破解jetbrains公司的系列产品(Idea, pycharm,clion,phpstorm): PS : 有能力的建议购买正版,好吧. PS:均针对其对应的2018.3.1 ...
- mysql基础之数据类型
一.整型 分为:tinyint .smallint .mediumint .int .bigint 常用的 分为以下三项: tinyint. smallint.int 数据类型 存储范围 字节 tin ...
- Java虚拟机的内存
JDK1.8之前,java内存分为 线程共享区:堆.方法区.直接内存(非运行时数据区的一部分).线程私有区:程序计数器.虚拟机栈.本地方法栈. JDK1.8开始,虚拟机取消了方法区,改为元空间. 程序 ...
- HashMap的源码学习以及性能分析
HashMap的源码学习以及性能分析 一).Map接口的实现类 HashTable.HashMap.LinkedHashMap.TreeMap 二).HashMap和HashTable的区别 1).H ...
- 纯css实现tab导航
仿照这个 实现了一个纯css的导航功能 html <div class="main"> <div id="contain1">列表一内容 ...
- vim的查找功能
vim是一款强大的编辑器. 在vim下要查找字符串: 一,全匹配: 1,从上往下查找,比如“string” : /string 2,从下往上查找,比如“string” : ?string 二,模糊 ...
- 如何在C++中使用boost库序列化自定义class ?| serialize and deserialize a class in cpp with boost
本文首发于个人博客https://kezunlin.me/post/6887a6ee/,欢迎阅读! serialize and deserialize a class in cpp Guide how ...
- VSCode, Django, and Anaconda开发环境集成配置[Windows]
之前一直是在Ubuntu下进行Python和Django开发,最近换了电脑,把在Virtual Box 下跑的Ubuntu开发机挪过来总是频繁崩溃,索性就尝试把开发环境挪到Windows主力机了. 不 ...
- P1046 陶陶摘苹果
题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出1010个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个3030厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在 ...
- 不止面试-JVM垃圾回收面试题详解
第一部分:面试题 本次分享我们将尝试回答以下问题: GC 是什么? 为什么要有 GC? 简单说一下java的垃圾回收机制. JVM的常见垃圾回收算法有哪些? 为什么要使用分代回收机制? 如何判断一个对 ...