【问题标题】:Converting Date() to IsoString doesn't show correct hh:mm:ss将 Date() 转换为 IsoString 不显示正确的 hh:mm:ss
【发布时间】:2017-09-29 17:17:37
【问题描述】:

我有一个类似 const date=new Date() 的日期变量,当我在 console.log 中显示它时,它会显示 Tue May 02 2017 11:35:50 GMT+0300 (GTB Daylight Time),这当然是正确的。我想将其转换为 Iso 日期,并且我正在使用 javascript 的 toIsoString() 函数,如下所示:

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

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

【问题讨论】:

标签: javascript date data-conversion isodate


【解决方案1】:

因为它给出了 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 :)

【讨论】:

  • 非常感谢。不幸的是我不能使用 moment.js
  • @user7334203:那么你可以使用这个自定义函数&谢谢:)你可以接受这个作为答案:p
  • “最佳”基于某些标准是相对的。 ;-)
【解决方案2】:

如果您想使用 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()
);

【讨论】:

    【解决方案3】:

    引用到ISOString documentation:

    ...时区始终为零 UTC 偏移量...

    时区始终设置为 UTC 0。这就是为什么我得到的值也和你一样,而且我在不同的时区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 2018-07-11
      相关资源
      最近更新 更多