Safari、IOS使用new Date()遇到的坑

1. 问题描述

在业务需求中,有关于时间的需求也是很常见的。比如展示当下时间、计算指定日期后的时间等等。
在开发时就遇到这么一个需求:
根据后端返回的时间获取其中月份

假设后端返回的时间为2022-04-1 10:10:10,然后根据这个数据获取月份:

new Date('2022-04-1 10:10:10').getMonth()+1; // 4

chrome、安卓均没问题,但是在Safari、IOS遇到了问题,结果为NAN
在这里插入图片描述

2. 产生原因

因为js的new Date()对于Safari、IOS有兼容问题

3. 解决办法

修改日期的格式,使用正则替换-
如:

let regDate = '2022-04-1 10:10:10'.replace(/-/g,"/")
new Date(regDate).getMonth()+1;

在这里插入图片描述
如此即可解决!

### iOS 18 Safari 中 `location.reload()` 方法的使用说明与错误处理 #### 方法概述 `location.reload()` 是 JavaScript 的内置方法,用于重新加载当前文档。它接受一个布尔参数,如果设置为 `true`,则强制从服务器重新加载页面;如果未提供该参数或设为 `false`,则可能从缓存中加载页面。 然而,在某些特定环境中(如微信浏览器、Vue 路由场景),或者在不同版本的 Safari 浏览器中,可能会遇到兼容性问题[^5]。对于 iOS 18 上的 Safari 浏览器,以下是一些已知的行为和解决方案: --- #### 已知行为 1. **默认缓存机制** 在现代浏览器中,包括 iOS 18 的 Safari,`location.reload()` 默认尝试从缓存中加载资源。这可能导致开发者无法观察到预期的效果,尤其是在开发阶段需要频繁更新文件的情况下[^4]。 2. **微信环境下的限制** 微信内置浏览器对 `location.reload()` 存在特殊限制,调用此方法通常会被忽略或失败。虽然这不是 iOS 18 Safari 的问题,但如果应用需支持微信分享链接,则应考虑替代方案。 3. **HTTPS 协议的影响** 如果网站运行于 HTTPS 下,部分旧版 Safari 可能会对相对路径跳转产生异常反应,尽管这一问题主要集中在更早版本(如 Safari 8.0)。但在调试过程中仍需注意网络请求的安全性和一致性[^1]。 --- #### 解决方案 针对上述情况,可以采取以下措施来确保 `location.reload()` 正常工作: 1. **强制刷新** 明确传递 `true` 参数给 `location.reload()`,从而绕过缓存并直接向服务器发起新请求: ```javascript window.location.reload(true); ``` 2. **检测事件状态** 对于一些特殊情况(例如页面被恢复而非正常加载的情况),可以通过监听 `onpageshow` 和 `event.persisted` 属性判断是否需要手动触发刷新操作: ```javascript window.onpageshow = function(event) { if (event.persisted) { window.location.reload(true); } }; ``` 3. **替换 URL 方案** 若发现 `location.reload()` 不生效,可改用修改地址栏的方式实现类似效果。这种方法尤其适用于 Vue 等前端框架中的单页应用场景: ```javascript const timestamp = new Date().getTime(); window.location.href = `${window.location.pathname}?t=${timestamp}`; ``` 4. **跨平台适配** 针对微信或其他第三方客户端内的嵌入式 WebView,建议优先测试其对标准 API 的支持程度,并准备备用逻辑。例如利用 `setTimeout` 延迟执行命令以规避潜在冲突: ```javascript setTimeout(() => { try { window.location.reload(true); } catch (e) { console.error('Reload failed:', e.message); window.location.assign(window.location.href); } }, 500); ``` 5. **Cookie 同步注意事项** 当涉及登录态保持时,务必确认 SFSafariViewController 是否正确同步了原生 Safari 的 Cookie 数据[^3]。否则即使成功完成了页面重定向也可能因缺少必要的认证信息而报错。 --- #### 示例代码片段 以下是综合以上策略的一个完整例子: ```javascript // 尝试安全地刷新当前页面 function safePageRefresh() { let reloadAttempted = false; // Step A: Try standard method first. try { window.location.reload(true); reloadAttempted = true; } catch (_) {} if (!reloadAttempted || !navigator.userAgent.includes('Safari')) { // Fallback B: Append query string to force update without cache hit. const currentUrl = window.location.href.split('?')[0]; window.location.replace(`${currentUrl}?_ts=${Date.now()}`); } // Optional C: Handle edge cases like WeChat restrictions gracefully here... } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值