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

时间:2016-03-01 19:14:42

标签: javascript angularjs datepicker angular-material

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

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

Tue Mar 22 2016 00:00:00 GMT+0100 (Mitteleuropäische Zeit)

但是在ajax请求中它是

2016-03-21T23:00:00.000Z

我不修改值,只是将对象赋予angulars http函数。

Angular是否需要一些配置来处理它?<​​/ p>

4 个答案:

答案 0 :(得分:7)

您可以尝试以下代码

dateObj.setMinutes((dateObj.getMinutes() + dateObj.getTimezoneOffset()));

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

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

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

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

答案 1 :(得分:5)

这两个字符串代表同一时间。一个是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

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

答案 2 :(得分:4)

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

查看1.1.1+版本。这将解决您的问题。

<md-datepicker ng-model="date" ng-model-options="{ timezone: 'utc' }"></md-datepicker>

答案 3 :(得分:1)

如果假设选择一个日期,例如Tue Aug 06 2019 00:00:00 GMT+0530 (India Standard Time),则
则得到2019-08-05T18:30:00.000Z。 (在我的情况下,它是相对于所选日期的上一个日期)
我利用toLocalDateString()来完成这项工作。

    // this.date = 2019-08-05T18:30:00.000Z
    const converted = new Date(this.date).toLocaleDateString(); 
    console.log(converted); // 8/6/2019 (MM/DD/YYYY) format