gpt4 book ai didi

javascript - JS 倒计时打破任何一个月的 31 号

转载 作者:行者123 更新时间:2023-11-29 15:32:28 25 4
gpt4 key购买 nike

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

由于我一直在倒计时到 2015 年 11 月 10 日,该脚本一直正常工作,直到今天,它无缘无故地增加了整整一个月的天数。但是,如果我将月份更改为十二月或一月,脚本就可以正常工作。

截至今天,即 10 月 31 日,剧本说到 11 月 10 日还有 40 天,我真的想不通为什么?正如我之前提到的,该脚本直到今天都运行良好。

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

更新:我的本地时间一到 00:00 (01/11/2015),倒计时就从 39 天变成了 9 天。

更新 2: 如果我将本地日期更改为 12 月 31 日,然后倒计时到 1 月 10 日,则会出现同样的问题。但是,如果我将本地日期更改为 11 月 30 日,并倒计时到 12 月 10 日,则该问题不会发生。所以这个问题似乎只出现在任何一个月的 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>

最佳答案

日期计算代码中有一个错误,这意味着它在该月的 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,代表十一月。这会将 toDate 设置为 2015 年 11 月 31 日,但该日期不存在。 JavaScript Date 对象通过将无效日期“滚动”到下个月来处理月底以外的无效日期。所以在这一行之后,toDate 的值为 1 December 2015。

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);

关于javascript - JS 倒计时打破任何一个月的 31 号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33454927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com