我需要编写一个在UTC时间内使用javascript日期对象的函数。它需要找到距离给定日期和下一个(或即将到来的)星期三晚上11点的差异,然后将其放入倒计时对象。一旦计时器达到0,我需要它再次重启。我知道我必须以某种方式使用getDay()函数,但我不确定如何解决这个问题。
答案 0 :(得分:2)
倒数计时器本身不需要jQuery。日期对象是普通的JavaScript的一部分。
对于UTC,您需要使用getUTCDay()
方法。
假设givenDate
是Date个对象,以下内容将计算到即将到来的星期三(第3天)的天数。
var daysUntilTarget = (3 - givenDate.getUTCDay() + 7) % 7;
如果给定日期是星期三,则上述内容将返回0
,您需要确定目标时间是否已过。你可以使用这样的东西:
var daysUntilTarget,
targetDay = 3,
targetHour = 23,
targetMinute = 0,
targetSecond = 0;
if (
targetDay == givenDate.getUTCDay() &&
targetHour * 3600 +
targetMinute * 60 +
targetSecond * 1 <
givenDate.getUTCHours() * 3600 +
givenDate.getUTCMinutes() * 60 +
givenDate.getUTCSeconds() * 1 +
givenDate.getUTCMilliseconds() / 1000
) {
//given date is after target time on target day
daysUntilTarget = 7;
}
使用setUTCDate()
和setUTCHours
方法设置目标日期和时间。
var targetDate = new Date(givenDate);
targetDate.setUTCDate(givenDate.getUTCDate() + daysUntilTarget);
targetDate.setUTCHours(targetHour, targetMinute, targetSecond);
使用getTime()
方法获取给定日期和目标日期的时间戳。然后你可以计算出它们之间的差值并除以1000得到秒数。
var countdownSeconds = (targetDate.getTime() - givenDate.getTime()) / 1000;
以下内容会将总秒数转换为天数,分钟数和秒数。然后,您可以将这些内容写入HTML中的元素。
var daysLeft, hoursLeft, minutesLeft, secondsLeft;
secondsLeft = parseInt(countdownSeconds);
daysLeft = parseInt(secondsLeft / 86400);
secondsLeft = secondsLeft % 86400;
hoursLeft = parseInt(secondsLeft / 3600);
secondsLeft = secondsLeft % 3600;
minutesLeft = parseInt(secondsLeft / 60);
secondsLeft = parseInt(secondsLeft % 60);
在使用它进行进一步计算之前,请务必将countdownSeconds
转换为整数。否则,由于浮点数学运算,您可能会得到不希望的结果。例如,
0.009 / 86400 = 1.0416666666666665e-7;
parseInt(1.0416666666666665e-7) = 1;
parseInt(0.009 / 86400) = 1; //probably not what you were expecting
要更新计时器,您可以减少计数器或使用客户端计算机的时钟来保持时间。
计数器方法不如时钟方法准确,因为前者没有考虑代码运行所需的时间。我注意到半小时内损失了3秒钟。调整循环间隔不会解决这个问题,因为不同的浏览器以不同的速度运行代码。由于其他原因,例如机器内存不足,代码可能会运行得较慢。
客户端计算机的开发时间可能不准确。但是,可以将服务器时间与客户端时间进行初始比较以计算偏移量。然后客户端时间可以用作计数器而不是绝对值。退回是如果客户时间改变,它将影响倒计时。请注意,夏令时所引起的时区更改和更改不会影响倒计时,因为它们不会影响时间戳。
我使用上述代码创建了两个小提琴。