我有一个倒数计时器的以下javascript代码:
var end = new Date('10/26/2016 4:00 PM');
var _second = 1000;
var _minute = _second * 60;
var _hour = _minute * 60;
var _day = _hour * 24;
var timer;
function showRemaining() {
var now = new Date();
var distance = end - now;
if (distance < 0) {
clearInterval(timer);
document.getElementById('countdown').innerHTML = 'EXPIRED!';
return;
}
var days = Math.floor(distance / _day);
var hours = Math.floor((distance % _day) / _hour);
var minutes = Math.floor((distance % _hour) / _minute);
var seconds = Math.floor((distance % _minute) / _second);
document.getElementById('countdown').innerHTML = minutes + 'mins ' + seconds + 'secs';
}
timer = setInterval(showRemaining, 1000);
这样可行,但问题是我需要倒计时器才能使用GMT / UTC时间,因为我在网站/服务器上的所有时间都以这种方式存储。
此倒数计时器正在使用用户当地时间进行now
设置。此脚本将在全球范围内访问,因此我无法使用本地时区,并且必须采用GMT / UTC格式。
即截至发布时间格林威治标准时间为13:17,但如果我在英国访问该剧本时间为14:17,那么倒计时将超过1小时。
我知道javascript有
toUTCString()
方法,但是当我尝试在
上调用它时function showRemaining() {
var now = new Date().toUTCString();
...
导致此输出:
NaNmins NaNsecs
jsfiddle在这里=&gt; https://jsfiddle.net/pzbz35q1/1/
答案 0 :(得分:0)
之前我使用过类似的东西:
var now = new Date();
var nowUTC = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());
var distance = end - nowUTC;
.toUTCString()将在变量中放置当前UTC日期/时间的字符串,因此基于它的任何计算都将失败(因为它试图从字符串中计算一个数字)。
答案 1 :(得分:0)
Javascript日期对象始终为UTC。它是传递给构造函数的值以及可被视为本地的 get * 方法返回的值。
Date构造函数解析“10/26/2016 4:00 PM”完全取决于实现,结果可能是无效的日期。如果解析正确,则应将其视为主机系统时区的2016年10月26日16:00。主机偏移量将用于为该日期和时间创建UTC时间值。请注意,对于世界上大多数人来说,使用mm / dd / yyyy格式是不明确的,因此应该将字符串的格式提供给解析器。
如果您希望将“10/26/2016 4:00 PM”视为UTC,那么您应该将其解析为:
/* Parse string in mm/dd/yyyy hh:mm ap format as UTC.
** '10/26/2016 4:23 PM'
** @param {string} s - string in required format
** @returns {Date} - if string is invalid then an invalid Date is returned
*/
function parseAsUTC(s) {
var b = s.split(/\D/);
var hr = b[3]%12 + (/pm$/i.test(s)? 12 : 0);
var d = new Date(Date.UTC(b[2], --b[0], b[1], hr, b[4]))
return d && d.getUTCMonth() == b[0] && d.getUTCHours() == hr? d : new Date(NaN);
}
var d = parseAsUTC('10/26/2016 4:23 PM');
console.log('UTC date: ' + d.toISOString() + '\n' +
'Local equivalent: ' + d.toLocaleString());