记一次解决不同时区的客户端需要展示的时间都为北京时间的问题

具体需求是这样的

产品说他们在国外不同时区的同事,在系统上看到的时间需要和在国内看到的时间一致

已知我们服务器存的时间是时间戳,而时间戳指的是该时刻到格林威治时间的毫秒数,并不存在时区的说法

解决办法

  1. 让在非北京时间时区的同事将其电脑时区改成东八区
  2. 使用dayjstimeZone插件,将时区转换成东八区

出现的问题

  1. 让其他时区的同事更换电脑时区,无疑是最简单的解决办法,但是会影响他们看正常时间的需求,而且他们也不愿意改,所以此方案只能作罢
  2. dayjstimeZone插件设置默认时区,但需要注意的是,设置默认时区之后,只有dayjs.tz对象的时区改变了,但是由于系统中已经有数不清的地方都是使用的dayjs对象来取的时间,不可能将每一处都改成dayjs.tz

破局

办法一显然是不可行了,只能从办法二去想办法解决。

但是将系统中所有使用dayjs来取值的都改成dayjs.tz也是行不通的,所以就只剩下了一条路:
想办法让dayjs取的值就是设置默认时区后的值

上代码

utils/dayjs.ts文件

typescript 复制代码
// 此处不是直接 import dayjs 而是引入 min.js 文件
// 后面会说明为什么会这样
import dayjs from 'dayjs/dayjs.min'
import timezone from 'dayjs/plugin/timezone'

dayjs.extend(utc)
dayjs.extend(timezone)
// 将默认时区从本地时区变为自定义(北京)时区。
dayjs.tz.setDefault('Asia/Shanghai')
// 包装 dayjs.tz 函数
const dayjsWrapper = function (...args) {
  return dayjs(...args).tz()
}
// 将 dayjs 上的所有属性方法都加到 dayjsWrapper 上
Object.assign(dayjsWrapper, dayjs)
export default dayjsWrapper

定义此次文件后,后续使用 dayjs 时都引入上述文件即可

typescript 复制代码
import dayjs from '@/utils/dayjs'

export const timestamp2time = (
  timestamp: number,
  format = 'YYYY-MM-DD HH:mm',
) => dayjs(timestamp).format(format)

这样,后续取值时就可以使用timestamp2time直接拿到转换成默认时区的值

最后优化一点

代码中有很多地方都没有通过工具函数,而是直接使用dayjs来取值的,寻找每一处都改为工具函数固然可行,但是麻烦,由此引入我们的杀手锏:webpack

javascript 复制代码
    alias: {
      '@': path.resolve(__dirname, 'src'),
      dayjs$: path.resolve(__dirname, '@/utils/dayjs'),
    }

这样,文件中所有使用import dayjs from 'dayjs'的地方都会在被 webpack 处理,实际导入的则是上面处理后的utils/dayjs.ts文件,这也是为此我们在这个文件中导入dayjs是从dayjs/dayjs.min中导入的原因。

自此,问题完美解决。 第一次写文章,写的不好的地方还请见谅。如有更好的解决办法,欢迎讨论。

相关推荐
思码梁田2 分钟前
CSS display 属性:从元素类型转换到隐藏元素的实用指南
前端·css·display·inline·block·none·inline-block
Csvn3 分钟前
⚡ Vite 依赖预构建(optimizeDeps)的 3 个经典坑:改了源码不生效、新增依赖 404、缓存怎么清都不行
前端
A242073493014 分钟前
Vue3 + TypeScript:后端数据在表格内渲染后进行增删改的完整实现步骤
前端·javascript·typescript
他们叫我 悦儿遥遥雨17 分钟前
.NET 8 Web开发入门(六):Blazor 全栈开发——告别 JavaScript 焦虑
前端·javascript·.net
用户21816970493024 分钟前
Flutter(九)StatelessWidget StatefullWidget
前端
paopaokaka_luck25 分钟前
基于springboot3+vue3的乡村医生诊疗管理系统(AI助手、协同过滤算法、webSocket实时聊天、Echarts图形化分析)
前端·网络·人工智能·spring boot·websocket·网络协议·echarts
编程风暴26 分钟前
3类人群的数据分析实习类型选择+4条选错红线
java·前端·数据分析
其美杰布-富贵-李26 分钟前
Vue 3 模块导入教程:import、export 与文件组织
前端·javascript·vue.js
Bigger37 分钟前
堆了 20 套主题、10+ 组件,用户还是用不出来?我给设计 Skill 加了「自动驾驶」
前端·ai编程·视觉设计
贾天佑忆月 迷失的昵1 小时前
.NET Web开发技术简单整理
前端·.net