JS倒计时打破了任何一个月的第31天

时间:2015-10-31 18:11:53

标签: javascript

我一直在使用我在interwebz上找到的javascript来计算特定日期/时间的剩余时间,包括它的时区。到目前为止,该脚本运行得很好(非常感谢这个社区)。

正如我一直倒计时到2015年11月10日,剧本一直在正常工作,直到今天,它以某种方式无缘无故地增加了整整几个月的时间。但是,如果我将月份更改为12月或1月,则脚本运行正常。

截至今天,10月31日,剧本说距离11月10日还有40天,我真的无法理解为什么?正如我之前提到的,脚本一直运行到今天。

有没有人可以解释为什么它会像这样,以及如何解决它?

更新:当我的当地时间到达00:00(2015年11月1日)时,倒计时从39天变为9天。

更新2:如果我将当地日期更改为12月31日,并倒计时到1月10日,则会出现同样的问题。 但是,如果我将当地日期更改为11月30日,并倒计时到12月10日,则问题会发生 NOT 。所以这个问题似乎与任何一个月的第31天都是隔离的。

下面的完整(修改)脚本:

<!--Copy and paste just above the close </BODY> of you HTML webpage.-->

<SCRIPT type="text/javascript">

// ****  Time Zone Count Down Javascript  **** //
/*
Visit http://rainbow.arch.scriptmania.com/scripts/
 for this script and many more
*/

////////// CONFIGURE THE COUNTDOWN SCRIPT HERE //////////////////

var month = '11';     //  '*' for next month, '0' for this month or 1 through 12 for the month 
var day = '10';       //  Offset for day of month day or + day  
var hour = 14;        //  0 through 23 for the hours of the day
var tz = -5;         //  Offset for your timezone in hours from UTC
var lab = 'tzcd';    //  The id of the page entry where the timezone countdown is to show

function start() {displayTZCountDown(setTZCountDown(month,day,hour,tz),lab);}

    // **    The start function can be changed if required   **
window.onload = start;

////////// DO NOT EDIT PAST THIS LINE //////////////////

function setTZCountDown(month,day,hour,tz) 
{
var toDate = new Date();
if (month == '*')toDate.setMonth(toDate.getMonth() + 1);
else if (month > 0) 
{ 
if (month <= toDate.getMonth())toDate.setFullYear(toDate.getFullYear() + 1);
toDate.setMonth(month-1);
}
if (day.substr(0,1) == '+') 
{var day1 = parseInt(day.substr(1));
toDate.setDate(toDate.getDate()+day1);
} 
else{toDate.setDate(day);
}
toDate.setHours(hour);
toDate.setMinutes(0-(tz*60));
toDate.setSeconds(0);
var fromDate = new Date();
fromDate.setMinutes(fromDate.getMinutes() + fromDate.getTimezoneOffset());
var diffDate = new Date(0);
diffDate.setMilliseconds(toDate - fromDate);
return Math.floor(diffDate.valueOf()/1000);
}
function displayTZCountDown(countdown,tzcd) 
{
if (countdown < 0) document.getElementById(tzcd).innerHTML = "Sorry, you are too late."; 
else {var secs = countdown % 60; 
if (secs < 10) secs = '0'+secs;
var countdown1 = (countdown - secs) / 60;
var mins = countdown1 % 60; 
if (mins < 10) mins = '0'+mins;
countdown1 = (countdown1 - mins) / 60;
var hours = countdown1 % 24;
var days = (countdown1 - hours) / 24;
document.getElementById(tzcd).innerHTML = days + " day" + (days == 1 ? '' : 's') + ' + ' +hours+ 'h : ' +mins+ 'm : '+secs+'s';
setTimeout('displayTZCountDown('+(countdown-1)+',\''+tzcd+'\');',999);
}
}
</SCRIPT>
<p><font face="arial" size="-2">The countdown script at </font><br><font face="arial, helvetica" size="-2"><a href="http://rainbow.arch.scriptmania.com/scripts/">Rainbow Arch</a></font></p>

1 个答案:

答案 0 :(得分:1)

日期计算代码中有一个错误,这意味着它在本月31日运行时无法正常工作。

这是在10月31日运行时计算到11月10日时运行的代码;我已删除了if无法运行的所有代码:

var month = '11';
var day = '10';

var toDate = new Date();
toDate.setMonth(month-1);
toDate.setDate(day);

倒数计时器为什么显示从10月31日起的40天到11月10日?让我们逐步完成上面的代码:

var toDate = new Date();

此时,toDate是2015年10月31日。

toDate.setMonth(month-1);

month-1是10,代表11月。这会将toDate设置为2015年11月31日,但该日期不存在。 JavaScript Date对象通过“滚动”来处理月末的无效日期。他们前进到下个月。因此,在此行之后,toDate的值为2015年12月1日。

toDate.setDay(day);

最后,toDate最终将于2015年12月10日结束。这是自2015年10月31日起的40天。

不是单独调用setFullYear()setMonth()setDate(),而是最好一起收集所有值,然后从所有这些值中创建一个Date对象一个人去。这样可以避免Date对象在日期计算期间具有无效的中间值。

我建议在函数setTZCountDown

中替换以下代码
var toDate = new Date();
if (month == '*')toDate.setMonth(toDate.getMonth() + 1);
else if (month > 0) 
{ 
if (month <= toDate.getMonth())toDate.setFullYear(toDate.getFullYear() + 1);
toDate.setMonth(month-1);
}
if (day.substr(0,1) == '+') 
{var day1 = parseInt(day.substr(1));
toDate.setDate(toDate.getDate()+day1);
} 
else{toDate.setDate(day);
}

以下内容:

var now = new Date();

var countdownToYear = now.getFullYear();
var countdownToMonth = now.getMonth();
var countdownToDay = now.getDate();

if (month === '*') {
    countdownToMonth += 1;
} else if (month > 0) { 
    if (month <= now.getMonth()) {
        countdownToYear += 1;
    }
    countdownToMonth = month - 1;
}

if (day.substr(0,1) === '+')  {
    var day1 = parseInt(day.substr(1), 10);
    countdownToDay += day1;
} else {
    countdownToDay = day;
}

var toDate = new Date(countdownToYear, countdownToMonth, countdownToDay);