【问题标题】:AngularJS date filter working on Chrome but not on FirefoxAngularJS 日期过滤器适用于 Chrome 但不适用于 Firefox
【发布时间】:2015-03-25 17:45:14
【问题描述】:

我有一个网页调用一些 PHP api 并呈现结果。
PHP 查询 MySQL 数据库并返回使用 AngularJS 指令和过滤器反序列化和格式化的 JSON 对象。

问题上升,因为 AngularJS 日期过滤器不直接支持 MySql 日期。
所以我写了这个

angular.module(...)
  .filter('mysqlDateToISO', function() {
        return function(input) {
            input = new Date(input).toISOString();
            return input;
        };
    });

和 HTML 部分看起来像

<p>
   Pubblicato il 
   {{arg.pubblicato_il | mysqlDateToISO 
                       | date:"dd MMM yyyy 'alle ore' HH:mm:ss"}}
</p>

Chrome 正确呈现结果:

Pubblicato il 25 Mar 2015 alle ore 16:01:00

Firefox 却没有:

Pubblicato il {{arg.pubblicato_il | mysqlDateToISO |日期:“dd MMM yyyy 'alle ore' HH:mm:ss"}}

Firefox 控制台显示此错误

RangeError: 无效日期

错误来自input = new Date(input).toISOString()

我该如何解决?

【问题讨论】:

  • 在 FF 中,AngularJS 是否正确解释了某事:{{ arg.pubblicato_il }}? ( 没有更多的 {{ ... }})?
  • 这是默认的DATE 还是DATETIME?你能举一个从mysql出来的日期格式的例子吗?或者最好是一组可重现的代码?
  • @DylanWatt:这是标准日期时间,例如 2015-03-25 16:01:00
  • @RaphaëlBraud: {{ arg.pubblicato_il }} 被正确处理,但作为字符串而不是日期时间......
  • 如果您在页面上看到花括号,这几乎可以肯定意味着您遇到了阻止正确角度编译的 JS 错误。控制台中没有错误吗?

标签: angularjs firefox


【解决方案1】:

您可以使用另一种方法来解析日期字符串,例如 Moment : http://momentjs.com/ 通过指定 mysql 日期字符串格式,然后提供输出格式。

这是一个例子:

moment("20111031", "YYYYMMDD").format("dd MMM YYYY [alle ore] HH:mm:ss")

将 20111031 替换为 mysql 日期序列化,将 YYYMMDD 替换为 mysql 日期格式。

使用 moment 将有助于对浏览器 Date 实现更加不可知

更完整的例子:

angular.module(...)
  .filter('mysqlDateToISO', function() {
        return function(input) {
            var result = moment(input, "YYYY-MM-DD HH:mm:ss")
                           .format("DD MMMM YYYY [alle ore] HH:mm:ss");
            return result;
        };
    });

【讨论】:

  • 我已经在看 MomentJs,但我不明白我应该在哪里转换日期:我应该在哪里使用你给我的示例指令?在 HTML 中作为自定义指令还是在控制器代码中?
猜你喜欢
  • 2014-11-19
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 2018-09-08
  • 2014-11-17
  • 2015-06-09
相关资源
最近更新 更多