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

具体需求是这样的

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

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

解决办法

  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中导入的原因。

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

相关推荐
嗝屁小孩纸几秒前
开发集成热门小游戏(vue+js)
前端·javascript·vue.js
赛博切图仔6 分钟前
深入理解 package.json:前端项目的 “身份证“
前端·javascript
UIUV9 分钟前
JavaScript 学习笔记:深入理解 map() 方法与面向对象特性
前端·javascript·代码规范
太平洋月光18 分钟前
MJML邮件如何随宽度变化动态切换有几列📮
前端·css
AAA不会前端开发20 分钟前
TypeScript核心类型系统完全指南
前端·typescript
徐同保24 分钟前
使用GitKraken把feature_xtb_1104分支的多次提交记录合并到一起,只保留一次提交记录,并合并到master分支
前端
小光学长32 分钟前
基于Vue的智慧楼宇报修平台设计与实现066z15wb(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
醉方休40 分钟前
web前端 DSL转换技术
前端
sen_shan40 分钟前
Vue3+Vite+TypeScript+Element Plus开发-27.表格页码自定义
前端·javascript·typescript
刺客_Andy1 小时前
React 第五十二节 Router中 useResolvedPath使用详解和注意事项示例
前端·react.js·架构