AngularJS日期过滤器的时间不正确

时间:2013-08-09 14:04:07

标签: datetime angularjs timezone

我有一个格式化为isotime的日期对象。我正在使用|日期过滤器在我的模板中很好地格式化它,但它错误地改变了时间。

本守则......

    <td>[[ user.last_online | date:'dd MMM yyyy - hh:mm a' ]]</td>
    <td>[[ user.last_online ]]</td>

结果......

enter image description here

现在我知道1小时的差异是因为时区,这正是我所期待的。但是会议纪要不正确。

在第一行中,应用过滤器时会添加13分钟。 在第二行中,添加了5分钟。

这两个值不仅错误,而且也不一致。

3 个答案:

答案 0 :(得分:4)

如果选中ISO8601,则可以看到正确的时间戳格式

yyyy-MM-ddTHH:mm:ss.SSSZ

毫秒应由3位数组成。我做了一个简单的测试,你可以在纠正毫秒部分后看到日期将正确呈现。

{{"2013-08-09T15:36:31.764546+02:00" | date:'dd MMM yyyy - hh:mm a'}}<br />
{{"2013-08-09T15:34:14.318753+02:00" | date:'dd MMM yyyy - hh:mm a'}}<br />
{{"2013-08-09T15:36:31.764+02:00" | date:'dd MMM yyyy - hh:mm a'}}<br />
{{"2013-08-09T15:34:14.318+02:00" | date:'dd MMM yyyy - hh:mm a'}}<br />

结果是

09 Aug 2013 - 09:49 AM
09 Aug 2013 - 09:39 AM
09 Aug 2013 - 09:36 AM
09 Aug 2013 - 09:34 AM

Demo

<强>更新

Python的datetime.isoformat()以微秒0 <= microsecond < 1000000返回时间。 Angularjs不喜欢,虽然这种格式根据ISO8601是正确的,因为ISO8601只需要one or more digits representing a decimal fraction of a second

所以我猜你可以使用strftime来格式化它。

答案 1 :(得分:2)

我认为user.last_online的值不正确或格式错误。如果选中ISO8601,则可以看到正确的时间戳格式:

yyyy-MM-ddTHH:mm:ss.SSSZ

My plunker

答案 2 :(得分:1)

您的日期格式正确。 ISO8601实际上不需要任何特定数量的小数。可能有零到7位小数或更多。如果您查看ISO8601规范的实际副本,则第4.2.2.4节说明如下:

  

...在十进制符号后面有必要的数字......

有一些较旧的浏览器在直接传递给new Date()构造函数时很重要,但是AFAIK会考虑错误并修复它们。

您遇到了AngularJS中的错误,该错误已在1.1.5版中修复。您可以在change log中找到它,如下所示:

  

日期过滤器:正确格式化日期超过3个亚秒数字(4f2e3606