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

new Date().getUTCDay()与赋值变量值不一致问题排查

问题排查与修复方案

首先,我一眼就看到了导致你描述的问题的核心bug——赋值运算符代替了比较运算符,这直接解释了为什么存储的currentDay和直接调用new Date().getUTCDay()结果不一致,同时也是移动端出现NaN错误的根源。

1. 核心错误:if(currentDay = 6)是赋值而非判断

你代码里的这行:

if(currentDay = 6) {
 firstDay = firstDay + 7;
}

这里的=是赋值运算符,不是比较运算符。这意味着不管currentDay原本的值是什么(比如周日时getUTCDay()返回0),都会被强制设置为6。这就完美解释了你遇到的现象:明明直接调用new Date().getUTCDay()返回0(周日),但存储的currentDay变量却变成了6——因为这行代码直接修改了它!

当跨周六到周日时,实际当前是周日(currentDay初始为0),但这行代码把它改成6,后续所有依赖currentDay的日期计算都会完全偏离预期,最终导致无效的日期值,进而让findDate、findMonth等函数返回NaN。

修复方法:

把赋值运算符改成严格比较运算符===(推荐,避免隐式类型转换问题):

if(currentDay === 6) {
 firstDay = firstDay + 7;
}

2. 次要优化:避免重复创建Date实例

你当前的代码多次调用new Date()来获取不同的时间字段:

var currentDay = new Date().getUTCDay();
var currentDate = new Date().getUTCDate();
var currentHour = new Date().getUTCHours()-(new Date().getTimezoneOffset()/60);
// ...其他字段

虽然大多数情况下这不会有问题,但如果代码执行时刚好跨了一秒(比如从59秒跳到0秒),不同的Date实例可能会有微小的时间差,尤其是在移动端性能波动的场景下,可能引发意外问题。建议只创建一次Date实例,然后从中获取所有需要的字段:

// 只创建一次当前时间的实例
const now = new Date();

var currentDay = now.getUTCDay();
var currentDate = now.getUTCDate();
var currentHour = now.getUTCHours() - (now.getTimezoneOffset() / 60);
var currentMinute = now.getUTCMinutes();
var currentYear = now.getUTCFullYear();
// 注意:你的代码里用到了currentMonth但没定义,记得从now.getUTCMonth()获取
var currentMonth = now.getUTCMonth();

3. 验证NaN问题的根源

当currentDay被错误赋值为6后,后续计算firstDate的逻辑会出现无效值:
比如周日(实际currentDay=0)时,代码里的currentDate + firstDay - currentDay变成currentDate + 2 -6 = currentDate -4。如果当前日期是当月的前4天(比如1号),结果会是负数,这显然是无效的日期值,传入findDate后自然会返回NaN,最终导致倒计时显示NaN。

修复了第一个核心bug后,这个NaN问题也会随之解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 23:57:50