使用date-fns-tz格式化时区时,如何将GMT+7显示为UTC+7?
解决date-fns格式化时区为UTC+xx:xx格式的问题
date-fns的zzz格式化令牌默认输出GMT+7这类格式,而你需要的是UTC+07:00且时间部分无空格(比如04:25PM),可以通过以下两种方式实现:
方法一:手动拼接时间与UTC偏移
先格式化时间部分,再单独计算并构造UTC偏移字符串:
import { formatInTimeZone } from 'date-fns-tz'; const formatToUtcStyle = (dateStr, timeZone) => { // 格式化时间部分,去掉AM/PM前的空格 const timePart = formatInTimeZone(dateStr, timeZone, 'hh:mm a').replace(' ', ''); // 计算目标时区相对于UTC的偏移分钟数(取反是因为getTimezoneOffset返回UTC与本地的差值) const zonedDate = new Date(formatInTimeZone(dateStr, timeZone, 'yyyy-MM-ddTHH:mm:ss')); const offsetMinutes = -zonedDate.getTimezoneOffset(); const sign = offsetMinutes >= 0 ? '+' : '-'; const hours = Math.floor(Math.abs(offsetMinutes) / 60); // 构造带冒号的偏移格式,比如+07:00 const offsetStr = `${sign}${String(hours).padStart(2, '0')}:00`; return `${timePart} UTC${offsetStr}`; }; // 调用示例 const result = formatToUtcStyle('2022-09-12T09:25:19.789Z', 'Asia/Bangkok'); console.log(result); // 输出 "04:25PM UTC+07:00"
方法二:结合Intl.DateTimeFormat获取标准偏移格式
利用浏览器的Intl API获取时区偏移,再替换GMT为UTC并补全格式:
import { formatInTimeZone } from 'date-fns-tz'; const formatToUtcStyle = (dateStr, timeZone) => { // 格式化时间部分,去掉AM/PM前的空格 const timePart = formatInTimeZone(dateStr, timeZone, 'hh:mm a').replace(' ', ''); // 使用Intl获取带偏移的字符串,提取偏移部分 const intlFormat = new Intl.DateTimeFormat('en-US', { timeZone, timeZoneName: 'shortOffset' }); const offsetMatch = intlFormat.format(new Date(dateStr)).match(/GMT([+-]\d{1,2})/); if (!offsetMatch) return timePart; // 处理偏移格式,补冒号并替换为UTC前缀 const offset = offsetMatch[1]; const formattedOffset = offset.length === 3 ? `${offset.slice(0, 3)}:00` : `${offset.slice(0, 3)}:${offset.slice(3)}`; return `${timePart} UTC${formattedOffset}`; }; // 调用示例 const result = formatToUtcStyle('2022-09-12T09:25:19.789Z', 'Asia/Bangkok'); console.log(result); // 输出 "04:25PM UTC+07:00"
另外你之前的第二段代码错误设置了timeZone: 'UTC',这会导致时区计算偏差,即使修正为目标时区,zzz仍会输出GMT格式,所以需要上述自定义处理来匹配moment-timezone的输出效果。
内容的提问来源于stack exchange,提问作者bramastaVic
相关产品推荐
相关产品推荐

