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

标签 javascript date datetime timezone

假设我们有这个日期时间:

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

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

  • 2018 年 7 月 21 日星期六 14:00:00 GMT+0200(巴黎、马德里(时间)) 使用 Chrome

  • 2018 年 7 月 21 日星期六 14:00:00 UTC+0200 使用 Internet Explorer 等

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

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

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

最佳答案

在 ECMA-262 中,对带时区的日期字符串格式化的内置支持有限,存在依赖于实现的 toStringtoLocaleString 方法或toISOString,始终为 UTC。如果 toISOString 允许参数指定 UTC 或本地偏移量(默认为 UTC),那就太好了。

编写您自己的函数来生成具有本地偏移量的 ISO 8601 兼容时间戳并不困难:

function toISOLocal(d) {
  var z  = n =>  ('0' + n).slice(-2);
  var zz = n => ('00' + n).slice(-3);
  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()) + '.' +
         zz(d.getMilliseconds()) +
         sign + z(off/60|0) + ':' + z(off%60); 
}

console.log(toISOLocal(new Date()));

关于javascript - Date.toISOString() 但本地时间而不是 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49330139/

相关文章:

javascript - 旧日期的 Intl.DateTimeFormat 时区问题

java - Joda时间(Java): Hijri to Gregorian conversion inaccurate?

mysql - 按日期显示周

java - 如何在 YMDHMS (ISO 8601) 中获取两个日期/时间之间的持续时间

javascript - 删除 ' + e.link[0].href + ' 开头和结尾的字符?

javascript - 在 mocha 测试报告器中使用 ajax-post 失败

java - 关于即使网页滚动也保持静态的链接/文本/图像

java - 如何将 DatePicker 值转换为字符串?

mysql - JPA、Glassfish、Mysql : UTC time conversion occuring twice

javascript - 获取屏幕、当前网页和浏览器窗口的大小