分类
标签
AI AionUi AI工作台 AI模型交互 Android CSS DevOps Dioxus Docker Docker Swarm ECS Electron Flutter Frontend Go Grok Hono HonoX HTML5 IoT IPC通信 IPFS Islands 架构 JavaScript JAX K3s Kamal Kubernetes n8n Pagefind React React Native Reactive Rust SaaS Serverless SQLite Tauri TF-IDF Transformer Twitter TypeScript UI Framework Vue Wails Web API WebAssembly WebSocket Web应用 Web服务器 Web框架 不可变数据 云原生 代码重构 信息流 倒排索引 全文检索 全栈框架 最佳实践 分布式 前端优化 动画 博客 后端 图片 存储 定时器 容器化 容器编排 小程序 工作流 工具 工具开发 工程化 并发 开发工具 异步 微服务 快速开发 思考 性能优化 技术选型 推荐系统 搜索引擎 效率 数据可视化 数据处理 数据流转 数据结构 无障碍服务 机器学习 架构 架构设计 框架 模板 流式处理 深度学习 游戏开发 状态管理 用户体验 看板 移动端 算法 组件 缓存 编译器 自动化 设计模式 负载均衡 跨平台 跨平台开发 路由 边缘计算 运维 部署 重构 集群管理 静态网站
489 字
2 分钟
手写一个同步服务端时间的小工具
在前端开发的过程中,开发者经常会用到 new Date() 来获取当前时间,但是 new Date() 是获取的当前操作系统的时间,由于用户可以修改当前电脑时间,所以它是不准确的。
大部分情况下,用户修改当前电脑时间都没有什么问题,但是当我们需要根据服务端传递的数据时间与当前时间进行计算时,前端展示就会出错。同时,需要过期时间的数据(时间)存入前端缓存( localStorage, IndexedDB )中也是会出现问题。
这时候我们考虑使用服务器提供的时间a,而不是前端时间。服务器每次进行数据交互时都会在响应头提供时间数据。我们可以通过该数据修正前端时间。

于是个人写了一个小工具 sync-time 。以 fetch 为例子:
import { sync, time, date } from 'sync-time'
async function getJSON() {
let url = 'https://www.npmjs.com/search?q=';
let response
try {
response = await fetch(url);
// 响应头部通常会有 date 数据
console.log(response.headers.get('date'))
// 把响应头时间作为服务器时间,调用 sync 同步数据
sync(response.headers.get('date'))
} catch (error) {
}
return response.body
}
getJson()
// => 返回数字,即修正好的毫秒 getTime
time()
// 1670345143730
// 返回 Date,new Date(time())
date()
// Wed Dec 07 2022 00:46:47 GMT+0800 (中国标准时间)源代码如下所示:
let diffMillisecond: number = 0
// 获取前端时间
const getCurrentTime = (): number => (new Date()).getTime();
// 同步时间
const sync = (time: Date | string): void => {
// 没有传递时间,直接使用前端时间
if (!time) {
diffMillisecond = 0
return
}
// 获取 UNIX 时间戳
const syncTime = time instanceof Date ? time.getTime() : Date.parse(time)
// 当前是 NaN,直接返回
if (Number.isNaN(syncTime)) {
return
}
// 获取两个时间的差值
diffMillisecond = syncTime - getCurrentTime()
}
// 补差值并获取 UNIX 时间戳
const time = (): number => getCurrentTime() + diffMillisecond
const date = (): Date => new Date(time())
export {
sync,
time,
date
}手写一个同步服务端时间的小工具
https://wsafight.github.io/personBlog/posts/sync-time/