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

iPad、iPhone Safari浏览器时间差问题:存储读取时间相差5小时

iOS Safari本地存储时间差5小时的问题根源及解决方案

嘿,这个问题我之前做跨端项目的时候也踩过坑,根源其实是iOS Safari对无时区标识的ISO 8601格式时间的解析规则和其他主流浏览器不一致。

问题拆解

你用format生成的时间字符串是2019-07-30T11:00:00——这个格式属于ISO 8601,但没有附带任何时区信息。当你把它存入localStorage再读取解析时:

  • Chrome、Firefox等浏览器会默认将这种无时区的ISO字符串当作本地时区的时间来解析;
  • 但iOS Safari会严格遵循早期的ISO标准,把无时区的ISO字符串默认当作UTC时间来处理。

结合你遇到的5小时时差来看,你所在的时区应该是UTC+5(本地时间比UTC早5小时):当Safari读取到2019-07-30T11:00:00时,会认为这是UTC的11点,转成本地时间就变成了11:00 - 5小时 = 06:00,这就是你看到的异常。

解决方案

针对这个问题,有两种常见的修复思路:

1. 存储时带上时区标识(推荐)

如果你的项目用的是Moment.js(从你的format写法来看大概率是),可以修改格式化规则,让生成的字符串附带时区偏移:

const pickupDate = format(this.pickupAddressComponent.pickupDate, 'YYYY-MM-dd\'T\'HH:mm:ssZ');
// 生成的结果类似:2019-07-30T11:00:00+05:00

这样iOS Safari读取时就能正确识别时区,不会再出现时差问题。

如果你更倾向于统一用UTC时间存储,也可以先把时间转成UTC再格式化:

const pickupDate = format(this.pickupAddressComponent.pickupDate.utc(), 'YYYY-MM-dd\'T\'HH:mm:ss');
// 读取时再转成本地时区:moment(utcStr).local()

2. 读取时手动按本地时区解析

如果不想修改存储的格式,读取时可以手动拆分时间字段,用Date构造函数直接传入本地时间参数,避免Safari的自动解析:

// 从localStorage读取字符串
const storedDateStr = localStorage.getItem('pickupDate');
// 拆分日期和时间部分
const [datePart, timePart] = storedDateStr.split('T');
// 拆分年月日、时分秒(注意月份是从0开始的,要减1)
const [year, month, day] = datePart.split('-').map(Number);
const [hour, minute, second] = timePart.split(':').map(Number);
// 构造正确的本地时间Date对象
const correctDate = new Date(year, month - 1, day, hour, minute, second);

内容的提问来源于stack exchange,提问作者Ramana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:22:31