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

React ES5日期库返回结果不一致,iOS环境偶现异常求助

问题分析与修复

原代码存在两个核心问题,导致跨设备(尤其是iOS Safari)出现错误结果:

  1. toLocaleString转字符串再解析的不可靠性:new Date(new Date().toLocaleString("en-US", {timeZone: "America/Denver"}))的逻辑依赖浏览器对本地化字符串的解析规则,iOS Safari会忽略字符串中的时区信息,按设备本地时区解析,导致currentDatetime不是正确的丹佛时间。
  2. 无时区的cutoff字符串解析差异:new Date("2020-04-19 23:59:59")在Chrome中会被解析为UTC时间,但在Safari中会被解析为设备本地时区时间,直接导致跨设备的比较结果不一致。
修复方案

核心思路是统一基于UTC时间戳进行比较,避免时区解析差异:

  1. 将丹佛时区的cutoff时间转换为对应的UTC时间戳
  2. 获取当前丹佛时间对应的UTC时间戳
  3. 比较两个时间戳,判断cutoff是否已过

以下是兼容所有设备的原生代码:

const cutoffDateStr = "2020-04-19 23:59:59";

// 将丹佛时区的时间字符串转为UTC时间戳
function denverTimeToUTCTimestamp(dateStr) {
  const [datePart, timePart] = dateStr.split(' ');
  const [year, month, day] = datePart.split('-').map(Number);
  const [hour, minute, second] = timePart.split(':').map(Number);
  
  // 判断该日期丹佛是否处于夏令时(MDT为夏令时,UTC-6;MST为标准时间,UTC-7)
  const tempDate = new Date(Date.UTC(year, month - 1, day, hour, minute, second));
  const tzName = new Intl.DateTimeFormat('en-US', {
    timeZone: 'America/Denver',
    timeZoneName: 'short'
  }).format(tempDate).split(' ').pop();
  const offsetHours = tzName === 'MDT' ? -6 : -7;
  
  // 计算丹佛时间对应的UTC时间戳
  return Date.UTC(year, month - 1, day, hour - offsetHours, minute, second);
}

// 获取当前丹佛时间对应的UTC时间戳
function getCurrentDenverUTCTimestamp() {
  const now = new Date();
  // 提取丹佛当前时间的年、月、日、时、分、秒
  const formatter = new Intl.DateTimeFormat('en-US', {
    timeZone: 'America/Denver',
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: false
  });
  const parts = formatter.formatToParts(now);
  const year = parseInt(parts.find(p => p.type === 'year').value);
  const month = parseInt(parts.find(p => p.type === 'month').value) - 1;
  const day = parseInt(parts.find(p => p.type === 'day').value);
  const hour = parseInt(parts.find(p => p.type === 'hour').value);
  const minute = parseInt(parts.find(p => p.type === 'minute').value);
  const second = parseInt(parts.find(p => p.type === 'second').value);
  
  // 判断当前丹佛是否处于夏令时
  const tzName = new Intl.DateTimeFormat('en-US', {
    timeZone: 'America/Denver',
    timeZoneName: 'short'
  }).format(now).split(' ').pop();
  const offsetHours = tzName === 'MDT' ? -6 : -7;
  
  return Date.UTC(year, month - 1, day, hour - offsetHours, minute, second);
}

// 核心判断逻辑:当前丹佛时间已过cutoff则返回true
const isCutoffPassed = getCurrentDenverUTCTimestamp() > denverTimeToUTCTimestamp(cutoffDateStr);
console.log(isCutoffPassed);
关键说明
  • 用Intl.DateTimeFormat精准提取丹佛时区的时间信息,避免字符串解析的兼容性问题
  • 自动处理丹佛的夏令时切换(MDT/MST),确保时间戳计算准确
  • 所有比较基于UTC时间戳,彻底消除跨设备的时区解析差异

内容的提问来源于stack exchange,提问作者PAIDIPELLY HEMANTH RAO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:31:07