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
相关产品推荐
相关产品推荐

