最近在业务中遇到一个使用 Day.js
创建 UTC 时间再转换时区的异常。纠正了长久以来一个自己对于 Date()
构造函数的误解。
展示一段示例代码,以便让大家来理解我的误解:
// 引入 dayjs 并扩展 utc
import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
dayjs.extend(utc)
// 示例时间文本
const demoTimeStr = '2025-08-20 00:00:00'
// 使用 dayjs 创建一个 UTC 模式的 dayjs 实例
const utcDayjsInst = dayjs.utc(demoTimeStr)
// 输出格式化后的时间文本
console.log('utcDayjsInst1.format:', utcDayjsInst.format('YYYY-MM-DD HH:mm:ss'))
// utcDayjsInst1.format: 2025-08-20 00:00:00
// 使用示例时间文本创建一个 Date 实例
const demoDateInst = new Date(demoTimeStr)
// 使用 Date 实例创建一个 UTC 模式的 dayjs 实例
const utcDayjsInst2 = dayjs.utc(demoDateInst)
// 输出格式化后的时间文本
console.log('utcDayjsInst2.format:', utcDayjsInst2.format('YYYY-MM-DD HH:mm:ss'))
// utcDayjsInst2.format: 2025-08-19 16:00:00
可以非常直接明显的看到两个UTC模式下输出的时间文本是不一样的。
当然在事后写回顾的时候真的觉得自己特别的蠢 😂,但确实在当时困扰了我一段时间。