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

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

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

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来模拟服务器的时间,然后每隔一段时间就获取一次服务器的时间,这样就可以减少服务器的压力了。

总结

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

目录
相关文章
|
3月前
|
监控 Java 应用服务中间件
低并发编程|如何用720个请求让后端服务器瘫痪
本次故障因应用启动时未有效校验核心依赖模块初始化异常,导致后续请求处理中抛出无法捕获的错误,引发线程阻塞,最终耗尽HSF线程池,服务不可用。排查发现类初始化失败且异常未被正确处理,结合线程无限等待问题,确认为依赖初始化异常与流处理中断所致。修复措施包括加强启动校验、捕获Throwable及设置合理超时。总结指出,系统稳定性需从细节入手,防微杜渐,避免连锁故障。
低并发编程|如何用720个请求让后端服务器瘫痪
|
1月前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
147 5
|
5月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
522 1
|
6月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
417 70
|
5月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
340 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
7月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
356 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
4月前
|
人工智能 监控 前端开发
AI工具:前端与后端的终极对决?谁将成为新时代的宠儿?
深入探讨AI工具对前端和后端开发的具体影响、各自的机遇与挑战,并分析未来开发者如何驾驭AI,实现能力跃迁。
220 0
|
7月前
|
前端开发 算法 NoSQL
前端uin后端php社交软件源码,快速构建属于你的交友平台
这是一款功能全面的社交软件解决方案,覆盖多种场景需求。支持即时通讯(一对一聊天、群聊、文件传输、语音/视频通话)、内容动态(发布、点赞、评论)以及红包模块(接入支付宝、微信等第三方支付)。系统采用前后端分离架构,前端基于 UniApp,后端使用 PHP 框架(如 Laravel/Symfony),配合 MySQL/Redis 和自建 Socket 服务实现高效实时通信。提供用户认证(JWT 集成)、智能匹配算法等功能,助力快速上线,显著节约开发成本。
179 1
前端uin后端php社交软件源码,快速构建属于你的交友平台
|
6月前
|
监控 前端开发 小程序
陪练,代练,护航,代打小程序源码/前端UNIAPP-VUE2.0开发 后端Thinkphp6管理/具备家政服务的综合型平台
这款APP通过技术创新,将代练、家政、娱乐社交等场景融合,打造“全能型生活服务生态圈”。以代练为切入点,提供模块化代码支持快速搭建平台,结合智能匹配与技能审核机制,拓展家政服务和商业管理功能。技术架构具备高安全性和扩展性,支持多业务复用,如押金冻结、录屏监控等功能跨领域应用。商业模式多元,包括交易抽成、增值服务及广告联名,同时设计跨领域积分体系提升用户粘性,实现生态共生与B端赋能。
572 12
|
7月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现

热门文章

最新文章