iOS端倒计时显示NaN问题求助:桌面正常移动端失效
解决iOS上倒计时器日期解析显示NaN的问题
嘿,这个问题我之前也碰到过!核心原因是iOS的JavaScript引擎(JavaScriptCore)对非标准日期格式的解析支持非常严格,你现在用的'10:00 9 November 2020'格式在Chrome、Firefox这些桌面浏览器能正常解析,但iOS的Safari(包括WebView)根本认不出这种格式,导致new Date(EndDate)返回Invalid Date,后面的计算自然就全是NaN了。
两种可靠的修复方案:
方案1:改用iOS兼容的日期字符串格式
把日期改成'November 9, 2020 10:00'(月份 日期, 年份 时间)这种格式,iOS能完美识别:
var EndDate = 'November 9, 2020 10:00';
方案2:手动构造Date对象(最稳妥,彻底避免格式歧义)
如果担心不同浏览器的格式兼容问题,直接通过年、月、日、时、分来构造Date对象是最靠谱的——注意这里的月份是从0开始计数的,11月对应的是10:
// 对应 2020年11月9日10:00 var EndDate = new Date(2020, 10, 9, 10, 0, 0);
修改后的完整代码
我推荐用方案2的写法,彻底避开解析问题,下面是调整后的完整代码:
const daysEl = document.getElementById("days"); const hoursEl = document.getElementById("hours"); const minsEl = document.getElementById("mins"); const secondsEl = document.getElementById("seconds"); const totalSecondsEL = document.getElementById("TotalSecondsWB"); // 直接构造目标日期对象,月份从0开始,10代表11月 var EndDate = new Date(2020, 10, 9, 10, 0, 0); var myVar = setInterval(countDown, 1000); function countDown() { const countdownDate = EndDate; // 直接用已构造好的日期对象 const currentDate = new Date(); const totalSeconds = (countdownDate - currentDate) / 1000; const days = Math.floor(totalSeconds / 3600 / 24); const hours = Math.floor(totalSeconds / 3600) % 24; const mins = Math.floor(totalSeconds / 60) % 60; const seconds = Math.floor(totalSeconds) % 60; daysEl.innerHTML = days; hoursEl.innerHTML = formatTime(hours); minsEl.innerHTML = formatTime(mins); secondsEl.innerHTML = formatTime(seconds); totalSecondsEL.innerHTML = Math.floor(totalSeconds); // 简化判断逻辑,直接用totalSeconds if (totalSeconds < 1) { document.getElementById('countdown-section').innerHTML = document.getElementById('giveaway-section').innerHTML; myStopFunction(); } } function formatTime(time) { return time < 10 ? `0${time}` : time; } function myStopFunction() { clearInterval(myVar); } countDown();
<div id="countdown-section"> <h1>Our next drop is in:</h1> <div class="countdown-container"> <div class="countdown-el day-c"> <p class="big-text" id="days">0</p> <span>Days</span> </div> <div class="countdown-el day-c"> <p class="big-text" id="hours">0</p> <span>Hours</span> </div> <div class="countdown-el day-c"> <p class="big-text" id="mins">0</p> <span>Minutes</span> </div> <div class="countdown-el day-c"> <p class="big-text" id="seconds">0</p> <span>Seconds</span> </div> </div> <div style="display: none;" class="countdown-el day-c"> <p class="big-text" id="TotalSecondsWB">0</p> <span>Seconds</span> </div> </div> <div id="giveaway-section"> <h1>this will display the £1 bouquet section</h1> </div>
补充说明
为什么会有这种差异?因为不同浏览器的JS引擎对非ISO标准日期的解析逻辑不一样。桌面端的V8(Chrome)、SpiderMonkey(Firefox)会尝试兼容各种常见格式,但iOS的JavaScriptCore只严格支持符合规范的格式(比如ISO 8601或者MMM dd, yyyy HH:mm)。直接构造Date对象的方式完全跳过了解析步骤,是跨浏览器兼容的最优解。
内容的提问来源于stack exchange,提问作者GonzoRibbons




