角度材料的日期选择器错误的日期

cre*_*re8 12 javascript datepicker angularjs angular-material

我使用datepicker来选择日期并将其发送到服务器.

当我记录JS值时,我得到了正确的结果:

Tue Mar 22 2016 00:00:00 GMT+0100 (Mitteleuropäische Zeit)
Run Code Online (Sandbox Code Playgroud)

但在ajax请求中

2016-03-21T23:00:00.000Z
Run Code Online (Sandbox Code Playgroud)

我不修改值,只是给对象提供angulars http功能.

Angular需要一些配置才能处理它吗?

B.B*_*dan 7

您可以尝试以下代码

dateObj.setMinutes((dateObj.getMinutes() + dateObj.getTimezoneOffset()));
Run Code Online (Sandbox Code Playgroud)

无需本地化,在进行任何服务调用之前使用此代码.它将通过您在datepicker中选择的确切日期.

它适用于所有时区(+)和( - ),

示例:2016-03-21 00:00:00 GMT+0100,上面的代码将其转换为2016-03-21 01:00:00 GMT+0000.在服务上,它将其转换为2016-03-21 00:00:00.

我认为它会解决你的问题.


Chr*_*ris 6

这两个字符串代表同一时间.一个是UTC,即GMT + 0,你可以从Z结尾看到.另一个是在不同的时区,特别是GMT +1小时.

如果你有两个字符串的javascript日期对象,并将它们变成整数,即自1970年1月1日UTC以来经过的秒数,你会发现它们是相同的.它们代表同一时刻,但在两个不同的地理位置.

var d1 = new Date('Tue Mar 22 2016 00:00:00 GMT+0100');
var d2 = new Date('2016-03-21T23:00:00.000Z');

Number(d1);  // 1458601200000
Number(d2);  // 1458601200000
Run Code Online (Sandbox Code Playgroud)

一般来说这是件好事.处理时区变得非常混乱.我觉得服务器最好总是处理UTC.

  • 我强烈建议你不要尝试.服务器可以存储UTC,然后它可以将UTC发送回浏览器.Javascript可以从UTC时间构造一个"Date"对象,默认情况下会向用户显示一个本地化时区,而不必执行任何操作.如果你_really_必须在服务器上存储特定于时区的那个,你可以通过调用它的`.toString()`方法强制该值为一个字符串. (2认同)

Kun*_*hal 5

https://github.com/angular/material/pull/9410

检出1.1.1+版本。这样可以解决您的问题。

<md-datepicker ng-model="date" ng-model-options="{ timezone: 'utc' }"></md-datepicker>
Run Code Online (Sandbox Code Playgroud)

  • 我想在angular 2(+)和mat-datepicker中执行相同的操作,有解决方案吗?提前致谢!! (8认同)