You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 17:45:40