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

Expo(v40) Android端出现timeZone不支持RangeError如何解决?

解决方案

方案一:使用纯JS时区处理库(无副作用,推荐)

该方案完全不依赖系统Intl API和toLocaleString,不会污染全局方法,也不需要修改任何原生配置,完美适配Expo托管工作流的限制。

  • 卸载冲突的全局intl依赖(可选,若不需要全局intl能力可以直接移除):
    npm uninstall intl
  • 安装纯JS实现的时区库spacetime,其自带完整IANA时区数据,无任何原生依赖:
    npm install spacetime
  • 使用示例:
import spacetime from 'spacetime'
import * as Localization from 'expo-localization'

// 1. 获取设备当前时区
const deviceTz = Localization.timezone
// 2. 按指定时区格式化当前时间
const nowStr = spacetime.now(deviceTz).format('yyyy-MM-dd HH:mm:ss')
// 3. 转换指定时间到目标时区
const nyTime = spacetime(1620000000000).goto('America/New_York').format('MM/dd/yyyy hh:mm a')

方案二:保留date-fns生态的局部polyfill方案

如果你需要继续使用date-fns和date-fns-tz,可采用局部polyfill方案,不会全局修改toLocaleString,不会影响其他业务代码:

  • 安装formatjs系列局部polyfill依赖:
    npm install @formatjs/intl-datetimeformat @formatjs/intl-getcanonicallocales @formatjs/intl-locale
  • 在你单独封装的日期处理工具文件顶部按需引入polyfill,不要在项目入口全局引入:
// 仅在当前工具文件内生效,不会修改全局方法
import { DateTimeFormat } from '@formatjs/intl-datetimeformat'
// 按需引入你需要支持的语言包
import '@formatjs/intl-datetimeformat/polyfill-locales/zh'
import '@formatjs/intl-datetimeformat/polyfill-locales/en'
  • 调用date-fns-tz相关方法时,手动指定用局部引入的DateTimeFormat即可。

说明

之前你找到的polyfill方案会产生副作用的原因是其全局替换了Date.prototype.toLocaleString,上述两种方案均不会修改全局对象,不存在破坏其他业务代码的问题,也不需要修改build.gradle等原生配置,完全适配Expo v40的开发限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 10:03:03