Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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 为什么应用于日期对象的toISOString()会在将日期转换为字符串时生成错误的时间段?_Javascript_Typescript - Fatal编程技术网

Javascript 为什么应用于日期对象的toISOString()会在将日期转换为字符串时生成错误的时间段?

Javascript 为什么应用于日期对象的toISOString()会在将日期转换为字符串时生成错误的时间段?,javascript,typescript,Javascript,Typescript,我对将日期转换为字符串转换为TypeScript项目非常着迷: 我使用此函数执行转换: fromDateToString(date: Date) : String { let dateAsString = date.toISOString().substr(0, 19) console.log(dateAsString); return dateAsString; } 如您所见,它采用包含以下值的日期对象: Wed Feb 08 2017 07:00:00 GMT-0800

我对将日期转换为字符串转换为TypeScript项目非常着迷:

我使用此函数执行转换:

fromDateToString(date: Date) : String {

  let dateAsString =  date.toISOString().substr(0, 19)
  console.log(dateAsString);

  return dateAsString;

}
如您所见,它采用包含以下值的日期对象:

Wed Feb 08 2017 07:00:00 GMT-0800 (Ora standard del Pacifico USA)
理论上,它必须将该日期转换为以下字符串格式:

2017-02-08T07:00:00"
但我发现了一个奇怪的行为时间!!!生成的字符串不是上一个字符串,而是:

2017-02-08T15:00:00"
生成的时间段不是07:00:00,而是15:00:00


为什么??怎么了?我错过了什么?如何解决此问题?

值没有错误;你无视时区。返回一个以UTC编写的字符串,该字符串末尾带有
Z
,表示它是UTC格式的。你正在剥离字符串的一部分,说出它所在的时区

如果愿意,可以通过减去时区偏移量,在本地时间获得该字符串:

函数fromDateToString(date/*:date*/)/*:String*/{ 日期=新日期(+日期); date.setTime(date.getTime()-(date.getTimezoneOffset()*60000)); 让dateAsString=date.toISOString().substr(0,19); 返回日期字符串; }
log(fromDateToString(newDate())
2017-02-08T15:00:00
->这是UTC日期(ISO)[UTC有0:00偏移]

2017-02-08T07:00:00
->这里是GMT-0800

因此,如果我们将
2017-02-08T07:00:00
转换为UTC,我们需要增加8:00小时,因此
7+8=15
因此其给出时间
2017-02-08T15:00:00


如果不加/减,就不能直接忽略时区偏移量。

这是因为生成ISO字符串的EcmaScript算法总是使用UTC+0时区生成它。您不需要(也不应该)修改
Date
对象。下面是一个算法,用于获取带有本地时区的ISO字符串:

让toLocalISOString;
{
常量键盘=功能键盘(str){
返回字符串(str).padStart(2,“0”);
}
toLocalISOString=函数toLocalISOString(日期){
const tzOffset=date.getTimezoneOffset(),
tzPlus=tzOffset>=0;
返回日期。getFullYear()+
“-”+pad(date.getMonth()+1)+
“-”+pad(date.getDate())+
'T'+pad(date.getHours())+
“:”+pad(date.getMinutes())+
“:”+pad(date.getSeconds())+
'.+(date.getmillides()/1000).toFixed(3).slice(2,5)+
(tzPlus?”+“+pad(tzOffset/60):“-”+pad((tzOffset/60).toString().slice(1)))+
“:”+pad((tzOffset%60).toFixed(0));
};
}

看看完整的字符串
toISOString
给你的。因为时区
toISOString
将始终返回UTC时区的时间。根据文档,toISOString()始终返回UTC+0时区的日期,因此您必须搜索不同的转换方法。@Teemu-I…在某个时间点,
*60000
包含在其中?!怎么搞的?一些“翻页”编辑错误。谢谢@AndreaNobili-由于编辑错误,代码没有将分钟(从
getTimezoneOffset
)转换为毫秒。我已经修好了。