You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动