DatePipe 错误地更改日期
DatePipe changes the date incorrectly
我观察到,在 angular2 中使用 DatePipe 时,似乎出现了一种奇怪的行为。由于某种原因,在 运行 日期 '03/09/1992' 通过 DatePipe 之后,它被更改为 '03/08 /1992':
http://plnkr.co/edit/SK6Z9q8h7EqunmkqVtpt
(更新代码:错误修复)
@Component({
selector: 'my-app',
template: `
<div> Invalid Date: {{ somedate | date:'MM/dd/yyyy' }}</div>
<div> DateObject: {{ dateType }}</div>
<div> DateObject With Pipe: {{ dateType | date:'MM/dd/yyyy' }}</div>
<br>
<div> Other Valid Dates </div>
<div>{{ afterdate | date:'MM/dd/yyyy' }}</div>
<div>{{ dateTypeAfter }}</div>
<div>{{ beforedate | date:'MM/dd/yyyy' }}</div>
<div>{{ dateTypeBefore }}</div>
`,
})
export class App {
somedate:string;
afterdate: string;
beforedate: string;
dateType: Date;
dateTypeAfter: Date;
dateTypeBefore: Date;
constructor() {
this.somedate = '03/09/1992';
this.afterdate = '03/09/1993';
this.beforedate = '03/09/1991';
this.dateType = new Date(this.somedate);
this.dateTypeAfter = new Date(this.afterdate);
this.dateTypeBefore = new Date(this.beforedate);
}
}
如上所示,1991 年或 1993 年不会发生这种情况。结果:
Invalid Date: 03/08/1992
DateObject: Mon Mar 09 1992 00:00:00 GMT-0400 (Eastern Daylight Time)
DateObject With Pipe: 03/08/1992
Other Valid Dates
03/09/1993
Tue Mar 09 1993 00:00:00 GMT-0500 (Eastern Standard Time)
03/09/1991
Sat Mar 09 1991 00:00:00 GMT-0500 (Eastern Standard Time)
知道为什么会这样吗?还是我误解了什么?
问题实际上是夏令时区。
Mon Mar 09 1992 00:00:00 GMT-0400 (Eastern Daylight Time)
Tue Mar 09 1993 00:00:00 GMT-0500 (Eastern Standard Time)
Sat Mar 09 1991 00:00:00 GMT-0500 (Eastern Standard Time)
请注意 GMT 偏移量不同,日期管道似乎会注意这一点。这使得日期 03/09/1992 实际上转换为 03/08/1992 23:00:00 PM。
目前适用于我(但有其自身的问题)的一种可能方法是使用 UTC:
new Date(Date.UTC(1992, 2, 9, 5, 0, 0));
以上将确保偏移时间为5并跨时区标准化。
我观察到,在 angular2 中使用 DatePipe 时,似乎出现了一种奇怪的行为。由于某种原因,在 运行 日期 '03/09/1992' 通过 DatePipe 之后,它被更改为 '03/08 /1992':
http://plnkr.co/edit/SK6Z9q8h7EqunmkqVtpt
(更新代码:错误修复)
@Component({
selector: 'my-app',
template: `
<div> Invalid Date: {{ somedate | date:'MM/dd/yyyy' }}</div>
<div> DateObject: {{ dateType }}</div>
<div> DateObject With Pipe: {{ dateType | date:'MM/dd/yyyy' }}</div>
<br>
<div> Other Valid Dates </div>
<div>{{ afterdate | date:'MM/dd/yyyy' }}</div>
<div>{{ dateTypeAfter }}</div>
<div>{{ beforedate | date:'MM/dd/yyyy' }}</div>
<div>{{ dateTypeBefore }}</div>
`,
})
export class App {
somedate:string;
afterdate: string;
beforedate: string;
dateType: Date;
dateTypeAfter: Date;
dateTypeBefore: Date;
constructor() {
this.somedate = '03/09/1992';
this.afterdate = '03/09/1993';
this.beforedate = '03/09/1991';
this.dateType = new Date(this.somedate);
this.dateTypeAfter = new Date(this.afterdate);
this.dateTypeBefore = new Date(this.beforedate);
}
}
如上所示,1991 年或 1993 年不会发生这种情况。结果:
Invalid Date: 03/08/1992
DateObject: Mon Mar 09 1992 00:00:00 GMT-0400 (Eastern Daylight Time)
DateObject With Pipe: 03/08/1992
Other Valid Dates
03/09/1993
Tue Mar 09 1993 00:00:00 GMT-0500 (Eastern Standard Time)
03/09/1991
Sat Mar 09 1991 00:00:00 GMT-0500 (Eastern Standard Time)
知道为什么会这样吗?还是我误解了什么?
问题实际上是夏令时区。
Mon Mar 09 1992 00:00:00 GMT-0400 (Eastern Daylight Time)
Tue Mar 09 1993 00:00:00 GMT-0500 (Eastern Standard Time)
Sat Mar 09 1991 00:00:00 GMT-0500 (Eastern Standard Time)
请注意 GMT 偏移量不同,日期管道似乎会注意这一点。这使得日期 03/09/1992 实际上转换为 03/08/1992 23:00:00 PM。
目前适用于我(但有其自身的问题)的一种可能方法是使用 UTC:
new Date(Date.UTC(1992, 2, 9, 5, 0, 0));
以上将确保偏移时间为5并跨时区标准化。