假设我们有这个日期时间:
var d = new Date("Sat Jul 21 2018 14:00:00 GMT+0200");
将其导出为字符串 (console.log(d)
) 会在浏览器之间产生不一致的结果:
2018 年 7 月 21 日星期六 14:00:00 GMT+0200(巴黎、马德里(时间))
使用 Chrome2018 年 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 中,对带时区的日期字符串格式化的内置支持有限,存在依赖于实现的 toString 和 toLocaleString 方法或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/