如何阻止dayjs插件将时间自动转换为UTC时区?
Dayjs 保留原时区时间的解决办法
输入带时区偏移的时间字符串2024-06-17T02:15:00+02:00,加载utc和timezone插件后,直接用dayjs(date).format('HH:mm')输出的是UTC时间00:15,想要得到原时区的02:15,可以用以下两种方法解决:
方法1:用utcOffset锁定原始偏移
import * as dayjs from 'dayjs'; import * as utc from 'dayjs/plugin/utc'; import * as timezone from 'dayjs/plugin/timezone'; dayjs.extend(utc); dayjs.extend(timezone); // ... console.log('date', date, typeof date); const myDate = dayjs(date); // 提取原始偏移量,设置时保持时间值不变 myDate.utcOffset(myDate.utcOffset(), true); console.log('time', myDate.format('HH:mm')); // 输出 02:15
方法2:用tz插件指定原始时区
从字符串里提取偏移,转成Dayjs支持的时区标识(注意Etc/GMT的命名和偏移方向相反,+02:00对应Etc/GMT-2):
import * as dayjs from 'dayjs'; import * as utc from 'dayjs/plugin/utc'; import * as timezone from 'dayjs/plugin/timezone'; dayjs.extend(utc); dayjs.extend(timezone); // ... console.log('date', date, typeof date); const offsetStr = date.match(/[+-]\d{2}:\d{2}$/)[0]; const timezoneId = `Etc/GMT-${offsetStr.slice(1, 3)}`; const myDate = dayjs.tz(date, timezoneId); console.log('time', myDate.format('HH:mm')); // 输出 02:15
为什么之前的方法没用?
加载utc插件后,Dayjs解析带时区的字符串时会默认转成UTC存储。之前尝试的dayjs.tz(date, dayjs.tz.guess())是转成本地时区,不是原时区;dayjs(date).tz(dayjs(date).format('Z'))的写法不符合tz方法的参数要求,所以无效。
内容的提问来源于stack exchange,提问作者Kit
相关产品推荐
相关产品推荐

