Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Date.toISOString()但不是UTC而是本地时间_Javascript_Date_Datetime_Timezone - Fatal编程技术网

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

Javascript Date.toISOString()但不是UTC而是本地时间,javascript,date,datetime,timezone,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(巴黎,马德里(Heured'té)) 周六7月21日14:00:00 UTC+0200 2018使用Internet Explorer等 因此,我们无法向格式不一致的服务器发送日期时间 自然的想法是请求ISO860

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

var d = new Date("Sat Jul 21 2018 14:00:00 GMT+0200");
将其导出为字符串(
console.log(d)
)会在浏览器之间产生不一致的结果:

  • 2018年7月21日星期六14:00:00 GMT+0200(巴黎,马德里(Heured'té))

  • 周六7月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)?

我试过这个,似乎很管用,但是没有更自然的方法吗?

varpad=function(i){return(i<10)?'0'+i:i;};
var d=新日期(“2018年7月21日星期六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);

控制台日志在ECMA-262中,对于使用时区格式化日期字符串的内置支持有限,存在依赖于实现的toString和ToLocalString方法,或ToIsString(始终为UTC)。如果toISOString允许一个参数指定UTC或本地偏移量(默认值为UTC),那就好了

编写自己的函数以生成符合ISO 8601的带有本地偏移量的时间戳并不困难:

函数到本地(d){
var z=n=>('0'+n).slice(-2);
变量zz=n=>('00'+n).slice(-3);
var off=d.getTimezoneOffset();
变量符号=关闭<0?'+':'-';
off=Math.abs(关闭);
返回d.getFullYear()+'-'
+z(d.getMonth()+1)+'-'+
z(d.getDate())+'T'+
z(d.getHours())+':'+
z(d.getMinutes())+':'+
z(d.getSeconds())+'。'+
zz(d.getms())+
符号+z(关闭/60 | 0)+':'+z(关闭%60);
}
log(toISOLocal(newdate())我的版本:

//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
局部功能(d){
常数z=n=>('0'+n).slice(-2);
let off=d.getTimezoneOffset();
常量符号=关闭<0?'+':'-';
off=Math.abs(关闭);
返回新日期(d.getTime()-(d.getTimezoneOffset()*60000)).toISOString().slice(0,-1)+sign+z(off/60 | 0)+':'+z(off%60);
}

可能是的副本,请参阅此答案以了解每个操作的更详细说明:@LucaM该答案是一种完全不同的获取时间戳的方法,它不解释上述方法。它也不包括偏移量。嗨@RobG,我总是喜欢详细解释每个步骤的解决方案。这就是为什么我把答案联系起来。如果你能在你的代码片段中加入一些评论,我想这会提高你答案的质量。(只有我的2美分)