Date.toISOString()但是本地时间而不是UTC

时间:2018-03-16 22:05:16

标签: javascript date datetime timezone

我们说我们有这个日期时间:

var d = new Date("Sat Jul 21 2018 14:00:00 GMT+0200");

将其导出为字符串(console.log(d))会在浏览器中产生不一致的结果:

  • Sat Jul 21 2018 14:00:00 GMT+0200 (Paris, Madrid (heure d’été))使用Chrome

  • Sat Jul 21 14:00:00 UTC+0200 2018使用Internet Explorer等

因此我们无法将日期时间发送到格式不一致的服务器

然后,自然的想法是要求ISO8601日期时间,并使用d.toISOString();但是它给出了UTC日期时间:2018-07-21T12:00:00.000Z而我希望改为本地 - 时区时间:

2018-07-21T14:00:00+0200
or
2018-07-21T14:00:00

如何获得此功能(不依赖像momentjs这样的第三方依赖关系)?

我试过这个,似乎有用,但是不是有更自然的方法呢?



var pad = function(i) { return (i < 10) ? '0' + i : i; };

var d = new Date("Sat Jul 21 2018 14:00:00 GMT+0200");
Y = d.getFullYear();
m = d.getMonth() + 1;
D = d.getDate();
H = d.getHours();
M = d.getMinutes();
S = d.getSeconds();
s = Y + '-' +  pad(m) + '-' + pad(D) + 'T' + pad(H) + ':' + pad(M) + ':' + pad(S);
console.log(s);
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:4)

在ECMA-262中没有内置支持使用时区格式化日期字符串,有依赖于实现的 toString toLocaleString 方法或 toISOString < / em>,始终为UTC。如果 toISOString 允许参数指定UTC或本地偏移量(默认为UTC),那将是一件好事。

编写自己的函数来生成符合ISO 8601标准的时间戳,并带有局部偏移量并不困难:

&#13;
&#13;
function toISOLocal(d) {
  var z = n => (n<10? '0':'')+n;
  var off = d.getTimezoneOffset();
  var sign = off < 0? '+' : '-';
  off = Math.abs(off);

  return d.getFullYear() + '-' + z(d.getMonth()+1) + '-' +
         z(d.getDate()) + 'T' + z(d.getHours()) + ':'  + z(d.getMinutes()) + 
         ':' + z(d.getSeconds()) + sign + z(off/60|0) + z(off%60); 
}

console.log(toISOLocal(new Date()));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

我的版本:

  // https://stackoverflow.com/questions/10830357/javascript-toisostring-ignores-timezone-offset/37661393#37661393
  // https://stackoverflow.com/questions/49330139/date-toisostring-but-local-time-instead-of-utc/49332027#49332027
  function toISOLocal(d) {
    const z = n => ('0' + n).slice(-2);
    let off = d.getTimezoneOffset();
    const sign = off < 0 ? '+' : '-';
    off = Math.abs(off);
    return new Date(d.getTime() - (d.getTimezoneOffset() * 60000)).toISOString().slice(0, -1) + sign + z(off / 60 | 0) + ':' + z(off % 60);
  }