js 获取服务器时间——IE浏览器出现1970问题

需求

由于系统需求变更,需要获取服务器时间;但是由于自己前端js业务代码大部分已经写好,可能懒得原因,不想在移到后台去重新写,所以导致出现了下面的踩坑状况...在此记录一下...

自己前端js获取服务器时间代码(有bug的代码):

 var yearmonth = new Date($.ajax({async: false}).getResponseHeader("Date"));
    //输出结果为:Wed May 22 2019 11:08:47 GMT+0800 (中国标准时间) {}

出现的问题

首先,说明一下,这个代码看起来是没有问题的,但是在不同浏览器情况下,比如IE浏览器就会出现这样的情况:

  var yearmonth = new Date($.ajax({async: false}).getResponseHeader("Date"));
    //输出结果为:Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间) {}

是不是发现什么问题了,上一个结果是2019-05-22,而这一次结果是1970-01-01,这个是什么原因呢?下来我们来探讨一下

问题追踪

第一次出现这个状况是一位客户给我反应的这个问题,说他的日期一直显示1970-01,我说你关闭浏览器(带清缓存步骤),在重新打开试试,结果还是。然后我就懵了,赶紧回头去看代码,咦,代码没错啊!!然后就去找度娘问了半天,大致理出了点头绪。

实际上是这样的,归根结底是IE浏览器的缓存机制问题
下面来探讨一下过程!

这是正常请求时的状况:


正常请求
 

注意看请求头与响应头!请求头是向后端发起了请求,并在响应头响应了信息,内部包含“Date”关键字!

出现1970-01时的异常状况:


异常请求bug
 

注意看请求头与响应头!此时并没有向后端发起请求,此时是因为走了IE浏览器的缓存机制,所有响应头不准确,没有“Date”,所有方法没有获取到时间,就会走默认的1970-01-01

两者的比较:

 

从上图可以看出(正常的是第二个,异常是最后一个),异常的是走的IE浏览器的缓存机制,而正常的是走的http请求,所以问题就很清晰了。

 

结论

其实出现1970-01这个问题最终是浏览器的兼容问题,由于IE浏览器的缓存机制,导致请求头没有请求到,所以返回计算机的默认时间1970-01

解决办法

将js代码可以修改为:

    var yearmonth = new Date($.ajax({type:"HEAD",async:false,cache:false}).getResponseHeader("Date"));

相当于关闭浏览器的缓存,而加入type:"HEAD"是为了请求更快,默认为请求头

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值