如何在dayjs中完全忽略时区解析时间字符串?
问题
我想把类似'2024-08-24T20:00:00-04:00'(波士顿晚8点)的字符串传入dayjs,格式化后得到和原始字符串一致的时间,不做任何时区转换。
当前用dayjs(startTimeStr).format('YYYY-MM-DD H:mm')得到的是'2024-08-25 1:00',这是因为解析时会把带时区偏移的时间转成当前系统时区(我把电脑时区设为伦敦,模拟GMT时区的Remix服务器)的时间。
试过dayjs.tz,结果不对,推测和夏令时有关:
dayjs.extend(timezone) // ... const startTimeStr = '2024-08-24T20:00:00-04:00' const id = dayjs.tz(startTimeStr, 'America/New_York').format('YYYY-MM-DD H:mm') // '2024-08-25 1:00'
核心需求:传入带时区的日期字符串,得到完全匹配原始时间的dayjs对象,无视解析环境的时区、夏令时。即解析后再转回原格式,必须和原始字符串完全一致,无论何时何地解析。
解决方案
要实现完全保留原始时间信息、不做时区转换的需求,直接使用dayjs的parseZone插件即可,它会解析字符串并保留原始的时区偏移,不会转换成本地时间。
步骤1:扩展parseZone插件
import dayjs from 'dayjs'; import parseZone from 'dayjs/plugin/parseZone'; dayjs.extend(parseZone);
步骤2:解析并格式化
const startTimeStr = '2024-08-24T20:00:00-04:00'; // 解析字符串,保留原始时区偏移 const dateObj = dayjs.parseZone(startTimeStr); // 还原成原始格式,输出与输入完全一致的字符串 console.log(dateObj.format('YYYY-MM-DDTHH:mm:ssZ')); // 输出 '2024-08-24T20:00:00-04:00' // 提取原始字符串中的本地时间部分(如波士顿时间) console.log(dateObj.format('YYYY-MM-DD H:mm')); // 输出 '2024-08-24 20:00'
为什么之前的方法不对?
- 直接用
dayjs(startTimeStr):会自动将带时区偏移的时间转换为当前系统时区的时间,导致结果随解析环境变化。 - 用
dayjs.tz(startTimeStr, 'America/New_York'):当输入字符串已经包含时区偏移时,第二个参数会被忽略,它会先把字符串转成UTC时间,再根据系统时区处理(而非保留原始时区的本地时间),所以结果不符合预期。
内容的提问来源于stack exchange,提问作者Jonathan Tuzman
相关产品推荐
相关产品推荐

