Javascript GMT/UTC 中的倒数计时器

Javascript Countdown Timer in GMT/UTC

我有以下 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 在这里 => https://jsfiddle.net/pzbz35q1/1/

我以前用过类似下面的东西:

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 date/time 的字符串放入变量中,因此基于它的任何计算都将失败(因为它试图从字符串中计算数字)。

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

如果我错了请指正,但我认为我们可以这样做:

var end = new Date('Oct 26, 2016 04:00:00 GMT+00:00')

或者获取倒计时器的毫秒数:

var end = new Date('Oct 26, 2016 04:00:00 GMT+00:00').getTime()

getTime() 函数returns自 Unix 纪元以来的毫秒数。

因此,据我所知,这应该可以满足您的需求。您只需将毫秒转换为秒、分钟、小时、天,就像您正在做的那样。