前端如何在没有后端配合的情况下获取服务器时间?

简介: 现在有一个需求,前端需要同步服务器的时间,因为前端的时间是不可靠的,解决方案有很多,但是不管什么方案,都是需要和服务端进行交互,那么怎么减轻后端的工作量直接实现呢?

现在有一个需求,前端需要同步服务器的时间,因为前端的时间是不可靠的,解决方案有很多,但是不管什么方案,都是需要和服务端进行交互,那么怎么减轻后端的工作量直接实现呢?

HTTP Header 中的 Date

HTTP Header 中有一个字段叫做 Date,它的格式是 RFC 1123,也就是 Fri, 30 Sep 2022 02:30:19 GMT,这个时间是服务器的时间,我们可以直接从 HTTP Header 中获取这个时间,然后前端直接使用这个时间即可。

打开控制台,查看一下请求的 HTTP Header,可以看到 Date 字段,这个就是服务器的时间:

image.png

这里有一个细节,可以看到这个时间的结尾有GMT的字母,代表这个时间是 GMT 时间,也就是格林威治时间,我们需要将这个时间转换成本地时间,因为我们前端的时间是本地时间,如果不转换,那么前端的时间就会和服务器的时间不一致。

image.png

如上图,带了GMT的后缀的时间是ok的,不带的就需要转换了。

本地时间和 GMT 时间

我们知道,本地时间和 GMT 时间是有区别的,比如北京时间和 GMT 时间的区别是 8 小时,那么我们如何获取本地时间和 GMT 时间的区别呢?

const date = new Date()
const offset = date.getTimezoneOffset() // 480

这里的offset就是本地时间和 GMT 时间的区别,单位是分钟,如果是北京时间,那么offset就是 480,如果是东京时间,那么offset就是 540。

本地时间和 GMT 时间的转换

我们知道了本地时间和 GMT 时间的区别,那么我们就可以将 GMT 时间转换成本地时间了,这里有一个小技巧,我们可以直接使用new Date()来转换,因为new Date()可以接受GMT格式的时间,然后会自动转换成本地时间。

const date = new Date('Fri, 30 Sep 2022 02:30:19 GMT')
console.log(date) // Fri Sep 30 2022 10:30:19 GMT+0800 (中国标准时间)

这里我们可以看到,new Date()接受了GMT格式的时间,然后自动转换成了本地时间。

前端实现

现在我们已经知道了如何获取服务器的时间,以及如何将 GMT 时间转换成本地时间,那么我们就可以实现前端获取服务器时间了。

axios.head('https://www.baidu.com?_=' + new Date().getTime()).then(res => {
   
   
  const date = new Date(res.headers.date)
  console.log(date) // Fri Sep 30 2022 10:30:19 GMT+0800 (中国标准时间)
})

这里使用axios发送一个head请求,然后获取Date字段,然后转换成本地时间,这样就可以获取到服务器的时间了,加时间戳是为了防止浏览器缓存。

优化

上面的代码是可以正常工作的,但是有一个问题,就是每次都要发送一个head请求,这样会增加服务器的压力,所以我们可以优化一下,比如我们可以在页面加载的时候就获取服务器的时间,然后每隔一段时间再获取一次,这样就可以减少服务器的压力了。

let date = new Date()
function getServerTime() {
   
   
  setTimeout(() => {
   
   
    axios.head('https://www.baidu.com?_=' + new Date().getTime()).then(res => {
   
   
      date = new Date(res.headers.date)
      console.log(date) // Fri Sep 30 2022 10:30:19 GMT+0800 (中国标准时间)
    }).finally(() => {
   
   
      getServerTime()
    })
  }, 1000 * 60 * 5)
}
getServerTime()

function timeStep(time) {
   
   
  date.setTime(date.getTime() + time)
  setTimeout(() => {
   
   
    timeStep(time)
  }, time)
}
timeStep(1000);

这里我们使用setTimeout来模拟服务器的时间,然后每隔一段时间就获取一次服务器的时间,这样就可以减少服务器的压力了。

总结

没啥好总结的,就是获取服务器的时间,然后转换成本地时间,然后模拟服务器的时间,这样就可以实现前端获取服务器时间了。

目录
相关文章
|
10天前
|
存储 前端开发 小程序
表白墙完善(数据库,前端,后端Servlet),再谈Cookie和Session。以及一个关于Cookie的练习小程序
表白墙完善(数据库,前端,后端Servlet),再谈Cookie和Session。以及一个关于Cookie的练习小程序
|
10天前
|
前端开发 安全 JavaScript
如何区分是前端BUG还是后端BUG
1 基于经验 前端BUG特点: (1)界面排版、布局错误、兼容性问题 (2)网络不稳定导致JS或CSS未完全加载或请求超时(一般不需要提BUG),正常网络下加载超时 后端BUG特点: 业务逻辑、性能问题、数据问题、安全性问题 2 通过HTTP请求和响应信息 可以通过浏览器开发者工具(F12)、postman、fiddler(移动端可通过该工具抓包)、Charles、Proxyman、Wireshark、HttpCanary、tcpdump等工具。
22 1
|
12天前
|
前端开发 安全 Java
家政系统(用户端)介绍Java18+前端html+后端springboot
家政系统(用户端)介绍Java18+前端html+后端springboot
14 0
|
18天前
|
JSON 自然语言处理 网络协议
【字节跳动青训营】后端笔记整理-2 | Go实践记录:猜谜游戏,在线词典,Socks5代理服务器
猜数字游戏也算是入门一门编程语言必写的程序了。通过这个程序,我们可以熟悉Go语言中的输入输出、流程控制与随机函数的调用。
29 2
|
23天前
|
JavaScript 前端开发 NoSQL
构建基于Node.js的全栈应用:从前端到后端的完整指南
【5月更文挑战第24天】本文是关于使用Node.js构建全栈应用的指南,涵盖前端(React或Vue)、后端(Node.js + Express)和数据库(MongoDB)的选型与实现。文章介绍了项目结构、前端组件化开发、后端API接口编写、前后端联调及部署上线的注意事项,帮助读者掌握全栈开发流程。
|
25天前
|
前端开发 JavaScript Java
web 技术中前端和后端交互过程
客户端:上网过程中,负责浏览资源的电脑,叫客户端
31 0
|
27天前
|
存储 人工智能 前端开发
从前端到后端,探索Web开发的奥秘
Web开发是当今最热门的技术领域之一,涉及前端、后端、数据库等多个方面。本文将介绍Web开发的基本架构和技术要点,并深入探讨前后端交互、安全性等问题,帮助读者更好地理解Web开发的奥秘。
|
27天前
|
前端开发 Java Go
从前端到后端:构建现代化Web应用的技术演进
本文探讨了从前端到后端的技术演进,介绍了前端、后端以及多种编程语言,如Java、Python、C、PHP和Go,以及数据库在构建现代化Web应用中的应用。通过深入剖析各个技术领域的发展和应用,读者将对构建高效、可扩展、安全的Web应用有更深入的理解。
|
30天前
|
前端开发 Java Go
从前端到后端:构建现代化Web应用的技术实践
本文将介绍如何通过前端和后端技术相结合,构建现代化Web应用的技术实践。我们将探讨前端开发、后端架构以及多种编程语言(如Java、Python、C、PHP、Go)在构建高效、可扩展的Web应用中的应用。
|
30天前
|
前端开发 JavaScript Java
npm与Maven:前端与后端构建工具深度对比学习
npm与Maven:前端与后端构建工具深度对比学习