AngularUI Datepicker没有过滤器,发生了什么?

时间:2014-11-21 08:45:34

标签: javascript angularjs date datepicker

当我突然发现这个时,我在我的webapp中使用了一个angularUI datepicker:

http://plnkr.co/edit/MLnWCtYHMNqLeuFOetWH?p=preview

特别是我在控制器中设置日期如下:

$scope.getDate = function() {
   $scope.dt = new Date(2015,0,1);
};
$scope.getDate();

然后在我的HTML中我用这两种方式显示日期:

<pre>With angular date filter date is: <em>{{dt | date:'medium' }}</em></pre>
<pre>Without angular date filter is: <em>{{dt}}</em></pre>

正如你在这个阅读器中看到的那样,我选择了日期&#34; 01/01/2015&#34; (2015年1月1日)如果我看到带有Angular日期过滤器的plunker,我会得到正确的日期和时间。

但是,如果我删除过滤器,我会在过去1小时内获得相同的日期。

这肯定是时区的问题,但我找不到这种行为的任何来源,所以我想了解发生了什么。是否有任何解释或网站可供浏览?

此外,什么将到达服务器?我是否必须在服务器上进行一些特殊格式化? (我不能测试这个atm)

不知道这是否重要(我想是的),但我的浏览器住在意大利。

1 个答案:

答案 0 :(得分:2)

两个显示日期完全相同。它们的格式不同。当您实例化日期时,您的浏览器会使用您当前的时区(2015年1月1日在意大利的午夜,因此UTC + 1)。

使用日期过滤器时,Angular会在您当前的时区显示您的日期,而不会显示UTC日期。

试试吧:

var date = new Date(2015,0,1);
date.toString(); // -> "Thu Jan 01 2015 00:00:00 GMT+0100 (CET)"
date.toISOString(); // -> "2014-12-31T23:00:00.000Z" (Z means UTC time)

根据经验,在将日期发送到服务器时始终使用ISO8601日期格式(这是JSON.stringify在序列化具有日期值的对象时所执行的操作)。