2

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

这段代码...

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

结果在这个...

在此处输入图像描述

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

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

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

4

3 回答 3

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

更新

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

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

于 2013-08-09T14:18:41.827 回答
2

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

yyyy-MM-ddTHH:mm:ss.SSSZ

My plunker

于 2013-08-09T14:18:20.280 回答
1

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

...在小数点后有尽可能多的数字...

有一些较旧的浏览器在直接传递给new Date()构造函数时这很重要,但 AFAIK 那些被认为是错误并已修复。

您在 AngularJS 中遇到了一个错误,该错误已在 1.1.5 版中修复。您可以在他们的更改日志中找到它,如下所示:

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

于 2013-08-09T15:46:46.963 回答