Javascript 为什么应用于日期对象的toISOString()会在将日期转换为字符串时生成错误的时间段?
我对将日期转换为字符串转换为TypeScript项目非常着迷: 我使用此函数执行转换: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
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
)转换为毫秒。我已经修好了。