将 Date() 转换为 IsoString 显示不正确 hh:mm:ss

Converting Date() to IsoString doesn't show correct hh:mm:ss

我有一个像这样的日期变量 const date=new Date() 当我 console.log 这显示我 2017 年 5 月 2 日星期二 11:35:50 GMT+0300(GTB 夏令时)这是当然正确。我想将其转换为 Iso Date,我正在使用 javascript 的 toIsoString() 函数,如下所示:

const IsoDate = (date.toISOString()).slice(0, -5);
      console.log(IsoDate)

但它在控制台中向我显示: 2017-05-02T08:35:50 好像显示的是实际日期前3小时。为什么会这样?

因为它给出的时间是 GMT [格林威治时区]。 toISOString 方法始终为 UTC。

要获取保持时区的 ISO 字符串,请使用此函数

    function formatLocalDate() {
//pass date whatever u want
        var now = new Date(),
            tzo = -now.getTimezoneOffset(),
            dif = tzo >= 0 ? '+' : '-',
            pad = function(num) {
                var norm = Math.abs(Math.floor(num));
                return (norm < 10 ? '0' : '') + norm;
            };
        return now.getFullYear() 
            + '-' + pad(now.getMonth()+1)
            + '-' + pad(now.getDate())
            + 'T' + pad(now.getHours())
            + ':' + pad(now.getMinutes()) 
            + ':' + pad(now.getSeconds()) 
            + dif + pad(tzo / 60) 
            + ':' + pad(tzo % 60);
    }

当然最好的选择是 Moment JS :)

引用 ISOString documentation:

...The timezone is always zero UTC offset...

时区始终设置为 UTC 0。这就是为什么我得到的值也与您相同,但我处于不同的时区。

如果你想使用 toISOString 但得到你所在时区的当前日期,你可以先通过偏移量调整 UTC 分钟,然后添加时区字符串,例如

function toISOStringLocal(date) {
  // Copy date so don't modify original
  var d = new Date(+date);
  var offset = d.getTimezoneOffset();
  var sign = offset < 0? '+' : '-';
  // Subtract offset as ECMAScript offsets are opposite to usual
  d.setUTCMinutes(d.getUTCMinutes() - d.getTimezoneOffset());
  // Convert offset to string
  offset = ('0' + (offset/60 | 0)).slice(-2) + ('0' + (offset%60)).slice(-2);
  return d.toISOString().replace(/Z\s*/i,'') + sign + offset;
}

console.log('Current date: ' + toISOStringLocal(new Date()));

您还可以向 Date 原型添加方法:

// Return local date in ISO 8601 format
if (!Date.prototype.toISOStringLocal) {
  Date.prototype.toISOStringLocal = function() {
    var d = new Date(+this);
    var offset = d.getTimezoneOffset();
    var sign = offset < 0? '+' : '-';
    d.setUTCMinutes(d.getUTCMinutes() - d.getTimezoneOffset());
    offset = ('0' + (offset/60 | 0)).slice(-2) + ('0' + (offset%60)).slice(-2);
    return d.toISOString().replace(/Z\s*/i,'') + sign + offset;
  };
}

// Return UTC date in ISO 8601 format
if (!Date.prototype.toISODate) {
  Date.prototype.toISODate = function() {
    return d.toISOString().substr(0,10);
  };
}

var d = new Date();

console.log('The current local date is: ' + d.toISOStringLocal() + 
          '\nThe current UTC date is  : ' + d.toISODate()
);