You need to enable JavaScript to run this app. 使用Moment Timezone获取东京时区时间在iOS Safari返回错误值
优惠活动
大模型
产品
解决方案
定价
更多

使用Moment Timezone获取东京时区时间在iOS Safari返回错误值

问题原因

  • 问题根因是iOS 12及更早版本的Safari对不带时区标识的ISO时间字符串的解析规则和Chrome存在差异。
    你的代码中使用moment().tz('Asia/Tokyo').format('YYYY-MM-DDTHH:mm:ss')生成的东京时间字符串没有附带时区后缀(比如+09:00或者UTC标识Z),不同浏览器的处理逻辑不同:
    • Chrome会默认将无时区标识的ISO字符串识别为本地时区时间,你输出的东京时间2021-07-22T21:49:47会被直接解析为GMT+7时区的21:49,刚好符合你的预期。
    • iOS 12的Safari会默认将无时区标识的ISO字符串识别为UTC时间,2021-07-22T21:49:47会被当做UTC时间21:49,转换为GMT+7时区的本地时间时会加7小时,最终得到第二天的4:49,也就是你遇到的错误结果。

解决方法

方案1:直接转换Date对象(最推荐)

如果不需要中间的格式化字符串环节,直接调用Moment的toDate()方法即可,完全规避不同浏览器的字符串解析差异:

var currentDateTime = moment().tz('Asia/Tokyo').toDate();

方案2:格式化时补充时区标识

如果业务需要先生成格式化时间字符串再转Date,输出格式中增加时区后缀,让所有浏览器都能正确识别时间所属时区:

var tokyoTimeStr = moment().tz('Asia/Tokyo').format('YYYY-MM-DDTHH:mm:ssZ');
var currentDateTime = new Date(tokyoTimeStr);

方案3:使用Moment做时间解析

如果必须使用无时区后缀的时间字符串,用Moment自带的解析方法代替原生Date构造函数,屏蔽浏览器差异:

var tokyoTimeStr = moment().tz('Asia/Tokyo').format('YYYY-MM-DDTHH:mm:ss');
var currentDateTime = moment(tokyoTimeStr, 'YYYY-MM-DDTHH:mm:ss').toDate();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 07:06:00