GST倒数计时器格林威治标准时间/ UTC

时间:2016-10-26 13:24:45

标签: javascript date countdown utc gmt

我有一个倒数计时器的以下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/

2 个答案:

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