Calling toISOString() thows "ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked."

Calling toISOString() thows "ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked."

我在组件中有这个方法:

getTime(): Date {
  const date = new Date();
  date.setHours(this.hour);
  date.setMinutes(this.minute);
  date.setSeconds(0);
  return date;
}

我在另一个里面调用:

<input matInput [hidden]="true" formControlName="time"
           [ngModel]="this.timePicker.getTime().toISOString()"/>

但是,即使 string 正确生成(至少 JSON 看起来是这样):

"time": "2017-11-14T10:30:00.271Z"

我收到这个错误:

CreateGroupComponent.html:40 ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: '2017-11-14T10:30:00.338Z'. Current value: '2017-11-14T10:30:00.341Z'.
    at viewDebugError (core.js:9514)
    at expressionChangedAfterItHasBeenCheckedError (core.js:9492)
    at checkBindingNoChanges (core.js:9661)
    at checkNoChangesNodeInline (core.js:13674)
    at checkNoChangesNode (core.js:13646)
    at debugCheckNoChangesNode (

我只有在调用 toISOString() 时才会看到此错误。如果我只是 return Date 对象,那没问题,但将其转换为 ISO 字符串会出现异常。为什么?


谈论 toISOString() -

中的时区信息实际上在哪里
2017-11-14T10:30:00.271Z

?对我来说,它实际上应该是

2017-11-14T10:30:00.271Z+01:00

发生这种情况是因为每次 getTime 调用的毫秒数都会发生变化,这就是错误所说的内容。

应该是:

getTime(): Date {
  const date = new Date();
  date.setHours(this.hour);
  date.setMinutes(this.minute);
  date.setSeconds(0);
  date.setMilliseconds(0);  
  return date;
}

关于时区,the reference 个州,

The toISOString() method returns a string in simplified extended ISO format (ISO 8601) <...>. The timezone is always zero UTC offset, as denoted by the suffix "Z".

如果需要当地时间,请参阅 this question 了解可能的解决方案。